在此“简单”初始化中,i的值是什么?

时间:2019-08-03 11:23:45

标签: c++ variable-assignment

我对此代码有疑问:

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

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

3 个答案:

答案 0 :(得分:3)

首先,您是否测试过该编译器?

如果没有,那为什么呢?

除非编写一些调用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. x是对z进行附加分配的结果;
  3. zz +(后增加y)的结果;

然后您可以在列表中向后移动,并获得正确的结果:

  1. y ++的计算结果仅为y,因为后置增量仅影响y的值,而不影响表达式本身的结果;
  2. 那么
  3. z为z + y,即4 + 15
  4. 中间表达式变成i = x = z;(或者很明显的形式是i = (x = z);),这意味着i就像x是5一样。

无论您做什么,都请不要实际编写这样的代码,尽管它很容易解构,但乍一看并不是一件容易理解的事情,而且通常会引起混乱。

答案 1 :(得分:2)

  

我们能知道那个值吗?

是的

  

i的值是什么?

5

因为您将y添加到i,其中i的值为4(因为z被分配了y的值,即4)和1。 / p> 在初始化z之后,

*#*#33284#*#*递增。如@john所述,它在以下语句中递增。


正如@LightnessInOrbit所说,这不是好代码。忘记它,继续前进。

答案 2 :(得分:0)

是的,i的值为5。

只需跟踪代码即可。

y++递增,即先分配值,然后递增Y= 4。下一个

z += y的简写运算,即z= z + y,最初是z = 4,所以5 = 4+ 1是z = 5

x = z,即x = 5下一个

i = x,即i = 5