c如何计算包含前缀增量的表达式?

时间:2014-03-01 16:14:16

标签: c evaluation prefix-operator

假设在左边的每个语句执行之前x被初始化为0,结果就是右边显示的值:

(++x + ++x) + ++x == 7
++x + (++x + ++x) == 9
++x + ++x + ++x   == 7

为什么第一个语句结果为7,第二个语句结果为9 ???

为什么第一个语句的结果与第三个语句的结果相同???

1 个答案:

答案 0 :(得分:3)

这是未定义的行为......很可能编译器会编写看起来像这样的代码。

(++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

宣布所有这些对您当前使用的编译器有效。其他编译器可能足够聪明,可以返回相同的结果。它甚至可能取决于优化级别,它都可以归结为未定义的行为。

总之,不要编写看起来像这样的代码。我很确定你的编译器正在输出一些关于此的警告。

为了解释它正在发生的事情,你正在修改一个寄存器。在它可以进行操作之前,它必须评估“++”。所以有人可能认为你最终得到了:

1 + 2 + 3 => 5

但实际上,由于++不应该分配新的内存,它会增加适当的价值。可以使用括号强制从左到右的顺序。因此,在一种情况下,它会增加2次,然后第三次,当它总结r + x和版本括号部队每++由左到右,然后总和x + r。但是因为它是未定义的行为。它并不意味着什么。只是不要这样做。

相关问题