假设 x 在左侧的每个语句执行之前被初始化为 0,结果是右侧显示的值:
(++x + ++x) + ++x == 7
++x + (++x + ++x) == 9
++x + ++x + ++x == 7
为什么第一条语句的结果是 7 而第二条语句的结果是 9 ???
为什么第一条语句的结果和第三条语句的结果一样???
假设 x 在左侧的每个语句执行之前被初始化为 0,结果是右侧显示的值:
(++x + ++x) + ++x == 7
++x + (++x + ++x) == 9
++x + ++x + ++x == 7
为什么第一条语句的结果是 7 而第二条语句的结果是 9 ???
为什么第一条语句的结果和第三条语句的结果一样???
嗯,这是未定义的行为......编译器很可能会编写看起来像这样的代码。
(++x + ++x) + ++x == 7
x = 0
x++ => 1 (x)
x++ => 2 (x)
r = 2 + 2
x++ => 3 (x)
r + x = 7
还有这个
++x + (++x + ++x) == 9
x++ => 1 x + (++x + ++x)
x++ => 2 x + (x + ++x)
x++ => 3 x + (x + x)
//You'll have x + (x + x) where x is 3
// Now
r = 3 + 3
x + r = 9
Annnd 所有这些对您当前使用的编译器都是有效的。其他编译器可能足够聪明,可以返回一些没有的结果。它甚至可能取决于优化级别,而这一切都取决于未定义的行为。
总之,不要编写看起来像这样的代码。我很确定您的编译器正在输出一些关于此的警告。
解释一下它正在发生的事情是你正在修改一个寄存器。在它可以进行操作之前,它必须评估“++”。所以有人可能会认为你最终会得到:
1 + 2 + 3 => 5
但实际上,由于 ++ 不应该分配新内存,它会增加适当的值。可以使用括号强制从左到右的顺序。因此,在一种情况下,求和时它将增加 2 倍,然后增加 3 倍,r + x
并且带括号的版本强制每个++
从左到右然后 sum x + r
。但因为它是未定义的行为。这并不意味着什么。只是不要那样做。