【问题标题】:c, bitwise, logic expressionc、按位、逻辑表达式
【发布时间】:2011-01-26 22:39:08
【问题描述】:
int x = 0;
x^=x || x++ || ++x;

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

【问题讨论】:

标签: c


【解决方案1】:

这是未定义的行为。结果可能是任何东西。这是因为++xx ^=之间没有sequence point,所以不能保证哪个会先“完成”。

【讨论】:

  • 因为什么?你的意思是 x++ ,++x 等等……那些计算顺序没有定义,对吧?
  • @Andy,尤其是^=
  • 没有序列点是不正确的:|| 运算符始终是一个序列点。唯一导致 UB 的两个修改是最后一个 ++xx^=
  • @aschleper:是的,你是对的。我最初的回答是有点马虎。我现在要澄清它。
【解决方案2】:

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

【讨论】:

  • 好吧,你的编译器想要的任何答案。
【解决方案3】:

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

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

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

在你的例子中,我们有

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • xor 0 与 0 实际上是 00,0->0, 0,1->1, 1,0->1, 1,1->0。这不是一个好的开始答案:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多