您可能知道C / C ++没有指定表达式评估顺序。什么原因让他们不明确。
答案 0 :(得分:4)
它允许编译器优化。 一个例子是重新排序算法指令,以最大限度地使用ALU或通过计算隐藏内存延迟。
答案 1 :(得分:1)
C / C ++设计目标之一是为编译器提供高效的实现。因此,编译器在复杂表达式中选择各种子表达式的评估顺序相对自由;我们认为,此顺序不受运算符优先级和关联性的约束。在这种情况下,当我们在多个子表达式中修改相同的可变性时,行为变得不变。在放弃先前的值之后并且在表达式的任何其他部分被evalauted之前,不保证立即执行递增或递减操作。唯一的保证是在表达式被认为完成之前将执行更新。
未定义的行为意味着未定义且任何事情都可能发生。
来源:Steve Summit的C programmig FAQ