这个 "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 .
y
在 z
初始化后递增。正如@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++)));
i
是赋值给 x
; 的结果
x
是对 z
; 进行加法赋值的结果
z
是 z +
的结果(y
post 递增);
然后您可以通过列表向后工作,并会得出正确的结果:
- y++ 计算为简单的 y,因为 post 增量只影响 y 的值,而不影响表达式本身的结果;
- z 则为
z + y
,即 4 + 1
,或 5
;
- 中间表达式变成
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 = x
即 i = 5
.
我对这段代码有疑问:
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 .
y
在 z
初始化后递增。正如@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++)));
i
是赋值给x
; 的结果
x
是对z
; 进行加法赋值的结果
z
是z +
的结果(y
post 递增);
然后您可以通过列表向后工作,并会得出正确的结果:
- y++ 计算为简单的 y,因为 post 增量只影响 y 的值,而不影响表达式本身的结果;
- z 则为
z + y
,即4 + 1
,或5
; - 中间表达式变成
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 = x
即 i = 5
.