功能参数评估顺序

时间:2011-07-17 18:02:55

标签: c++ c function operator-precedence

以下操作的结果将打印出来:

x=5; 
printf("%d,%d,%d\n",x,x<<2,x>>2); 

答案:5,20,1

我认为订单尚未定义,但我在许多网站上找到了面试问题。

5 个答案:

答案 0 :(得分:3)

位移操作符不会修改变量的值...所以顺序无关紧要。

答案 1 :(得分:3)

评估顺序未指定,但无关紧要,因为您根本不修改x

所以程序定义明确,答案是给定的。

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

printf("%d,%d,%d\n", x, x <<= 2, x >>= 2); 

答案 2 :(得分:3)

来自C ++标准:

  

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

但是,如果参数为x>>=2x<<=2,那么您的示例只会有未定义的行为,因此x正在被修改。

答案 3 :(得分:1)

我在c++ standards找到了答案。

第5.2.2.8段:

  

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

换句话说,它仅取决于编译器。

答案 4 :(得分:-1)

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

然而,作为一个实际问题,参数通常从右到左进行评估。

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

在C中,参数以从右到左的顺序被推到堆栈,因此第一个参数(在这种情况下,char *“%d,%d,% d“)位于堆栈的顶部。参数通常(但不总是)按照推送的顺序进行评估。

更能说明您所谈论内容的问题是:

int i=1;
printf("%d, %d, %d", i++, i++, i++);

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