2011-11-03 137 views
3

我不知道有没有人可以为我解释这段代码?我想知道为什么这段代码会产生2

unsigned int x = 0; 
(x ^= x) || x++ || ++x || x++; 

printf("%d\n", x); 
当我编译这个使用gcc 4.2我的电脑上

,输出为2

原本我以为也许这行为是不确定的,但后来我的身影||比其他运营商的优先级低,所以答案不应该是3?由于有三个“++”。

有人可以解释一下吗?在x至0 /关

(x ^= x) 

设置所有位:谢谢

+3

它并不是'''的优先事项,事实上,它是一个序列点。 – Flexo

+0

行为是完全明确的(不同于这里定期问的类似问题)。 –

回答

6
  • (x ^= x)评价和它产生0,因此:
  • (x++)进行评价,并将其产量0,因此:
  • (++x)评价和它产生2,因此它停止

这一切归结为一条规则:||只评估其右侧如果它的左侧是假的。

+0

老鼠!你是对的。我在看它溢出一个32位整数,然后加3(它也会产生2),但你的答案是正确的。 –

+0

@PeterRowell这很有趣,我没有想到:-) – cnicutar

0

||运营商之间的表达将被评估的从左至右,直到一个是true。 (false);

x++ 

增量x,它现在1,但仍false,因为这是后增量。

++x 

(预)递增x,这是现在2并且还true,所以没有必要对||右手侧进行评估。

+0

你一定很困,0 XOR 0不评价为1,即使你有11.8k点:) –

+1

@owlstead - 我最初误读了代码。我想我已经编辑了这个错误。我错过了吗? – Flexo

+0

我现在正在读些不同的东西,所以我在更新时写了评论(编辑后提交2分钟,看起来好像是)。 –

5

问题是||运营商是短路。只要它找到真值,就不再需要检查剩余的||语句;答案是已知的。

(x ^= x)的计算结果为0。
x++的计算结果为0,然后递增x为1
++x的计算结果为2 - 真。

最终或声明不需要计算。它“短路”并立即返回true。

+0

这是看起来正确的答案,其他人忘记解释++运算符在评估表达式的那部分后生效。 –

1

这是短路语义在行动。第一个表达式x ^= x评估为0,第二个表达式也评估为0。第三个评估为2,然后逻辑表达式被短路,因为它的结果已经确定为true

2

行为是明确的。你正在观察||的短路行为;最终的x ++永远不会被评估。

0

当然,你不应该使用这样的结构,但让我们分析表达式。

有4个表达与快捷-OR组合:

a || b || c || d 

b,c和d,只能判断,如果是假,C和D仅当b为假太和D仅当所有从前是错误的。

Ints评估为0 == false,其他一切都不是错误的。

x ^= 0 

其中x为0再次为0。

x++ 

被评估并随后增加,所以它的计算结果为0,它调用表达式c,但后面的x会增加。

++x 

首先加,导致1,然后进行评价(导致1),这是原因,为什么d不评估,但B的增量未决,所以我们得到2.

但我不确定这样的行为是否被精确定义,并导致在所有编译器上得到相同的结果。

Avoid it. 
相关问题