这个 "simple" 初始化中 i 的值是多少?

Which is the value of i in this "simple" initialization?

我对这段代码有疑问:

int i, x, z = 4, y = 1;
i = x = z += y++;

i的值是多少?我们能知道那个值吗?

Can we know that value or not?

是的。

Which is the value of i?

5

因为您将 y 添加到 i,它们的值分别为 4(因为 i 被分配了 z 的值,即 4)和 1 .

yz 初始化后递增。正如@john 评论的那样,它在以下语句中增加了。


正如@LightnessInOrbit 评论的那样,这不是好的代码。忘掉它,继续前进。

首先,你有没有测试过它是否可以编译?

如果不是,那是为什么?

除非您编写一些调用 UB 的代码,否则关于该语言的基本语法,编译器会提供您需要的大部分答案。请自行测试,如果还是不清楚,或者表现怪怪的,那就值得一问了。

在这种情况下,它是有效的,所以让我们看一下。

#include <iostream>

int main() {
    int i, x, z = 4, y = 1;
    i = x = z += y++;

    std::cout << "i=" << i << std::endl;
}

我编译了,运行,结果如下:

$ g++ test.cpp -o test
$ ./test
i=5

那么,这一行到底发生了什么?

i = x = z += y++;

首先,添加括号更容易理解,因此很明显计算的内容和时间:

i = (x = (z += (y++)));
  1. i 是赋值给 x;
  2. 的结果
  3. x 是对 z;
  4. 进行加法赋值的结果
  5. zz + 的结果(y post 递增);

然后您可以通过列表向后工作,并会得出正确的结果:

  1. y++ 计算为简单的 y,因为 post 增量只影响 y 的值,而不影响表达式本身的结果;
  2. z 则为 z + y,即 4 + 1,或 5
  3. 中间表达式变成i = x = z;(或者,太明显的形式,i = (x = z);),这意味着i,就像x是5.

不管你做什么,请不要真的写这样的代码,虽然它很容易解构,但乍一看并不容易理解,而且往往会造成混淆。

是的,i 的值为 5。

只需跟踪代码即可。

y++ post 递增 i,e 首先赋值然后递增所以 Y= 4。下一个

z += y shorthand 操作即.., z= z + y ,最初 z=4 所以 5 = 4+ 1 所以 Z=5

x = z 即 x = 5 下一个

i = xi = 5.