Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数参数的求值顺序_C++_C_Function_Operator Precedence - Fatal编程技术网

C++ 函数参数的求值顺序

C++ 函数参数的求值顺序,c++,c,function,operator-precedence,C++,C,Function,Operator Precedence,以下操作的结果将打印什么: x=5; printf("%d,%d,%d\n",x,x<<2,x>>2); x=5; printf(“%d,%d,%d\n”,x,x2); 答复:5,20,1 我认为顺序是未定义的,但我在许多网站上发现上面的问题是面试问题。官方C规范中未定义评估顺序 然而,出于实用性考虑,参数通常从右到左进行评估 在您的问题中,位移位运算符不会改变X的值,因此计算顺序并不重要。无论是从左到右、从右到左还是从中间先计算,都会得到5,20,1 在C语言中

以下操作的结果将打印什么:

x=5; 
printf("%d,%d,%d\n",x,x<<2,x>>2); 
x=5;
printf(“%d,%d,%d\n”,x,x2);
答复:5,20,1


我认为顺序是未定义的,但我在许多网站上发现上面的问题是面试问题。

官方C规范中未定义评估顺序

然而,出于实用性考虑,参数通常从右到左进行评估

在您的问题中,位移位运算符不会改变X的值,因此计算顺序并不重要。无论是从左到右、从右到左还是从中间先计算,都会得到5,20,1

在C语言中,参数被按从右到左的顺序推送到堆栈上,这样第一个参数(在本例中,字符*%d,%d,%d”)就位于堆栈的顶部。参数通常(但并非总是)按其被推送的相同顺序进行计算

一个更能说明你在说什么的问题是:

int i=1;
printf("%d, %d, %d", i++, i++, i++);
官方答案是“未定义”。

实际的答案(在我尝试过的几个编译器/平台中)是“3,2,1”。

位移位运算符不修改变量的值。。。所以顺序并不重要。

评估的顺序是未指定的,但这并不重要,因为您根本没有修改
x

因此,该程序定义明确,答案如下所示

以下内容将具有未定义的语义:

printf("%d,%d,%d\n", x, x <<= 2, x >>= 2); 
printf(“%d,%d,%d\n”,x,x=2);
标准:

未指定参数的求值顺序。参数表达式求值的所有副作用在输入函数之前生效。未指定后缀表达式和参数表达式列表的求值顺序

但是,如果参数是
x>=2
并且
x我在中找到了答案,那么您的示例将只有未定义的行为

第5.2.2.8段:

未指定参数的求值顺序。所有副作用 参数表达式求值在函数启动之前生效 进入。后缀表达式的求值顺序和 未指定参数表达式列表


换句话说,它只依赖于编译器。

那么您的经验就非常有限。此外,一旦编译器优化掌握了if,那么就不知道会发生什么。所有这些假装你知道编译器在做什么是危险的。(a) 不要这样做;(b) 看在上帝的份上,请不要教它。奇怪的是,在我尝试过的所有实现中,你的例子都给出了“3,3,3”。诚然,我只测试了三个实现(msvc10、MingW(gcc 4.5.4)和),但它们都是使用非常广泛的实现。@Benjamin Lindley:我敢打赌,通过使用不同的优化,您可以更改值。感谢您对缩进的帮助。我指的是像后缀或前缀之类的操作符,而不是移位。为什么你认为它是未定义的呢?为什么你认为评价的顺序很重要?无论何时计算,每个参数都将具有相同的值。在
>=
情况下,模糊度是正交的。真正的问题是不确定性。虽然我没有看到对你的答案投反对票,但我可以假设答案是存在的,我唯一能想到的是,正如我们讨论的那样,行为不是未指定的,而是未定义的,这使得你的答案不完全正确。。。但我不会为此投反对票