我对此代码有疑问:
int i, x, z = 4, y = 1;
i = x = z += y++;
i
的值是多少?我们能否知道那个价值?
答案 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++)));
i
是分配给x
的结果; x
是对z
进行附加分配的结果; z
是z +
(后增加y
)的结果; 然后您可以在列表中向后移动,并获得正确的结果:
z + y
,即4 + 1
或5
; 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
。