操作数评估顺序+赋值副作用

时间:2010-06-04 21:21:31

标签: c

我想要下面的代码打印11,但打印12,除了在最后一种情况下打印10。

x=5; x1=x+(x=6); printf("%d\n",x1);  
x=5; x1=(x=x)+(x=6); printf("%d\n",x1);  
x=5; x1=(x+0)+(x=6); printf("%d\n",x1);  
x=5; x1=(x=5)+(x=6); printf("%d\n",x1);  

x=5; x1=(x=6)+x; printf("%d\n",x1);  
x=5; x1=(x=6)+(x=x); printf("%d\n",x1);  
x=5; x1=(x=6)+(x+0); printf("%d\n",x1);  
x=5; x1=(x=6)+(x=5); printf("%d\n",x1);  

gcc在每种情况下都说:'警告:'x'上的操作可能未定义'。

这是卑鄙的。

哈德

PS:毫无疑问,对不起。谢谢你的回答。 :)
PPS:实际代码是:

while ( data-(data=read(adr)&(1<<6)) ) i++;  

我正在等待adr的第6位停止翻转。

3 个答案:

答案 0 :(得分:2)

警告的原因是......序列点之间的评估顺序未指定。

答案 1 :(得分:2)

结果未定义,无需进一步说明。但是要解释编译器可以处理代码的两种可能方式:

int x = 1;
int n = (x=3) + x;

编译器可以先评估(x = 3),在这种情况下,对n的赋值值为6.或者它可以先计算x,在这种情况下,对n的赋值值为4.

答案 2 :(得分:1)

你可以使用很少使用的逗号运算符和另一个变量来编写你想要的循环:

while ( lastdata = data, lastdata != (data = read(adr) & (1<<6)) ) i++;