c,按位,逻辑表达式

时间:2011-01-26 22:39:08

标签: c

int x = 0;
x^=x || x++ || ++x;

最后x的答案是3。 如何分析这个表达? 对此有点困惑。 非常感谢。

4 个答案:

答案 0 :(得分:7)

这是未定义的行为。结果可能是任何事情。这是因为++xx ^=之间没有sequence point,因此无法保证首先“完成”。

答案 1 :(得分:2)

这是未定义的行为 - 所以你可以得到你想要的任何答案。

答案 2 :(得分:0)

正如其他人已经指出的那样,这是未定义的行为。但为什么呢?

在C语言编程时,语句和表达式之间存在固有的差异。在任何情况下,表达式评估应该给出相同的可观察结果(例如,(x + 5)+ 2与x +(5 + 2)相同)。另一方面,语句用于副作用的排序,也就是说,通常会导致写入某些内存位置。

考虑到上述情况,表达式可以安全地“嵌套”到语句中,而将语句嵌套到表达式中则不然。 “安全”是指“没有惊人的结果”。

在您的示例中,我们有

x^=x || x++ || ++x;

评估应该采用哪种顺序?自||对表达式进行操作,我们是否去(x || x ++)||无关紧要++ x或x || (x ++ || ++ x)甚至++ x || (x || x ++)。但是,由于x ++和++ x是语句(即使C允许它们用作表达式),我们也不能通过代数推理来进行。因此,您需要通过编写多个语句来明确表达操作的顺序。

答案 3 :(得分:-1)

XOR 0,0表示0.然后++两次等于2.然而,正如其他答案所指出的那样,没有序列点。所以输出可以是任何东西。