我不知道有没有人可以为我解释这段代码?我想知道为什么这段代码会产生2
unsigned int x = 0;
(x ^= x) || x++ || ++x || x++;
printf("%d\n", x);
当我编译这个使用gcc 4.2我的电脑上
,输出为2
原本我以为也许这行为是不确定的,但后来我的身影||比其他运营商的优先级低,所以答案不应该是3?由于有三个“++”。
有人可以解释一下吗?在x
至0 /关
(x ^= x)
设置所有位:谢谢
我不知道有没有人可以为我解释这段代码?我想知道为什么这段代码会产生2
unsigned int x = 0;
(x ^= x) || x++ || ++x || x++;
printf("%d\n", x);
当我编译这个使用gcc 4.2我的电脑上
,输出为2
原本我以为也许这行为是不确定的,但后来我的身影||比其他运营商的优先级低,所以答案不应该是3?由于有三个“++”。
有人可以解释一下吗?在x
至0 /关
(x ^= x)
设置所有位:谢谢
(x ^= x)
评价和它产生0,因此:(x++)
进行评价,并将其产量0,因此:(++x)
评价和它产生2,因此它停止这一切归结为一条规则:||
只评估其右侧如果它的左侧是假的。
老鼠!你是对的。我在看它溢出一个32位整数,然后加3(它也会产生2),但你的答案是正确的。 –
@PeterRowell这很有趣,我没有想到:-) – cnicutar
的||
运营商之间的表达将被评估的从左至右,直到一个是true
。 (false
);
x++
增量x
,它现在1
,但仍false
,因为这是后增量。
++x
(预)递增x
,这是现在2
并且还true
,所以没有必要对||
右手侧进行评估。
你一定很困,0 XOR 0不评价为1,即使你有11.8k点:) –
@owlstead - 我最初误读了代码。我想我已经编辑了这个错误。我错过了吗? – Flexo
我现在正在读些不同的东西,所以我在更新时写了评论(编辑后提交2分钟,看起来好像是)。 –
问题是||
运营商是短路。只要它找到真值,就不再需要检查剩余的||
语句;答案是已知的。
(x ^= x)
的计算结果为0。
x++
的计算结果为0,然后递增x
为1
++x
的计算结果为2 - 真。
最终或声明不需要计算。它“短路”并立即返回true。
这是看起来正确的答案,其他人忘记解释++运算符在评估表达式的那部分后生效。 –
这是短路语义在行动。第一个表达式x ^= x
评估为0
,第二个表达式也评估为0
。第三个评估为2
,然后逻辑表达式被短路,因为它的结果已经确定为true
。
行为是明确的。你正在观察||的短路行为;最终的x ++永远不会被评估。
当然,你不应该使用这样的结构,但让我们分析表达式。
有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.
它并不是'''的优先事项,事实上,它是一个序列点。 – Flexo
行为是完全明确的(不同于这里定期问的类似问题)。 –