以下操作的结果将打印出来:
x=5;
printf("%d,%d,%d\n",x,x<<2,x>>2);
答案:5,20,1
我认为订单尚未定义,但我在许多网站上找到了面试问题。
答案 0 :(得分:3)
位移操作符不会修改变量的值...所以顺序无关紧要。
答案 1 :(得分:3)
评估顺序未指定,但无关紧要,因为您根本不修改x
。
所以程序定义明确,答案是给定的。
以下将具有未定义的语义:
printf("%d,%d,%d\n", x, x <<= 2, x >>= 2);
答案 2 :(得分:3)
来自C ++标准:
参数的评估顺序未指定。参数表达式求值的所有副作用在输入函数之前生效。后缀表达式和参数表达式列表的评估顺序未指定。
但是,如果参数为x>>=2
和x<<=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”。