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

c如何计算包含前缀增量的表达式?,c,evaluation,prefix-operator,C,Evaluation,Prefix Operator,假设在执行左侧的每个语句之前,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

假设在执行左侧的每个语句之前,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
annd所有这些对您当前使用的编译器有效。其他编译器可能足够聪明,可以返回与某些编译器不相同的结果。它甚至可能取决于优化的级别,而这一切都取决于未定义的行为

总之,不要编写这样的代码。我很确定你的编译器输出了一些关于这个的警告

更详细地解释一下,您正在修改一个寄存器。在执行操作之前,它必须计算“++”。因此,有人可能会认为你最终会:

1 + 2 + 3 => 5

但在现实中,由于++不应该分配新内存,因此它会增加原有的值。可以使用括号强制从左到右的顺序。因此,在一种情况下,当求和
r+x
时,它将增加2倍,然后是第三倍,带括号的版本强制每个
++
从左到右,然后求和
x+r
。但因为这是一种未定义的行为。这并不意味着什么。不要这样做。

我闻到了未定义行为的味道。请参阅例如和谷歌的“序列点”,您可能想添加引发未定义行为的因素。我觉得这些评估不一致。。。我认为,如果第二次求值是从括号内的第一个
++x
开始的话,可能会更有意义。任何变量在没有插入序列点的情况下都不能修改一次以上。如果您这样做,编译器会发出删除所有文件的代码(尽管这有点极端)。@ThoAppelsin如果第二次求值确实首先对括号内的
++
求值,它也会给出
7
。这样做可能更有意义,但仍然是错误的。@LoïcFaure Lacroix计算括号内的
++
s,然后在不计算括号结果的情况下,返回并计算括号外的
++
x==3
,时不时地
r=x
,然后计算括号并将其添加到
r
r==9
,然后。。。我不知道它为什么会这样做,但现在对两个案例的处理方式是不一致的。