CB *_*ley 65

我们通过期望未定义的行为而不是任何特定的结果来解释它.由于表达式尝试多次修改x而没有插入序列点,因此行为未定义.

  • 那为什么不是语法错误?任何模糊的东西使它成为编译代码......似乎是疏忽. (4认同)
  • @Bill:这并不是真的要问这个,因为你的例子需要DFA来分析,而"表达式的多个子表达式修改相同的变量并且没有在整个表达式中通过序列点分开"至少在理论上是可诊断的只需通过本地分析表达式.但是C++标准表达规则的方式是"表达式的任何可允许的执行顺序"没有序列点分隔符,并且很难合理地预期实现不会推理所有合法执行命令. (3认同)

Art*_*ius 12

正如其他人所说,C和C++标准没有定义它将产生的行为.

但对于那些不明白为什么标准会做这样的事情的人来说,让我们来看一个"现实世界"的例子:

1 * 2 + 3 + 4 * 5
Run Code Online (Sandbox Code Playgroud)

1 * 2 + 3在我们计算之前计算没有错4*5.仅仅因为乘法具有比加法更高的优先级并不意味着我们需要在进行任何加法之前在表达式中执行所有乘法.事实上,您有效地执行计算有许多不同的订单.

如果评估有副作用,则不同的评估顺序会影响结果.如果标准没有定义行为,请不要依赖它.

  • (1*2 + 3)+(4 + 5)==(1*2)+(3 + 4*5).不仅有一种方法可以对执行进行排序,因此仍然保留了操作顺序.math是无状态的,但如果操作影响状态,则必须更具体地指定执行顺序. (2认同)
  • @Dustin Getz:从技术上讲,C++语法指定表达式必须是(((1*2)+ 3)+(4*5))而不是((1*2)+(3 +(4*5)))但你是对的,计算顺序可以是1*2,4*5,(1*2)+3,((1*2)+ 3)+(4*5)或1*2,(1*2 )+ 3,4*5,((1*2)+ 3)+(4*5)或许多其他可能性,包括并行完成的独立部分. (2认同)