下面的为自己实践得出的结论,并非官方文档
看段代码开篇(环境vs2015):
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int x=0, y[5] = {};
y[x] = x++ + x++ + ++x;
cout << x <<" "<< y[0] << y[1] << y[2] << y[3] << y[4];
system("pause");
}
预测下结果:
-->
-->
-->
-->
-->
-->
扫描二维码关注公众号,回复:
250084 查看本文章
上结果:
不知道和你的想象的结果一样吗?
y[x] = x++ + x++ + ++x;
我们都知道,++x会立刻执行,x++会稍后执行,既然是稍后,你知道会稍后到什么时候吗?
C/C++中是有一个抽象的序列点存在的(不是实际的东西,只是概念),序列点包括“:? , ; || && “ ,还有函数调用,和完全表达式,没错,x++就是会一直拖一直拖,直到拖到序列点的出现。 ------概念1
知道了概念1后我们来推一下,x初值为0,原式
y[x] = x++ + x++ + ++x; 相当于 y[x] = x + x + ++x ;++ ++
所以运算完 x + x + ++x 后,x 值变到了 1 ,所以改变的是 y[1]的值,这点可以理解了,那为什么 y[1]的值变成了 3?按理说不应该是 1 吗?OK
我们来看,x++ + x++ + ++x 的值我们可能会理解为 (x++)的值 + (x++)的值 + (++x)的值 ,其实不是的,编译器会依次执行 x++ ,x++ ,++x,
最后在计算他们三个相加的时候,他算的既不是 (x++)的值 + (x++)的值 + (++x)的值,也不是 x + x + (++x)的值,而是 x + x + x 的值,这个时候 x 已经变成了1,
所以表达式的值为3 ------概念2
这样,这个代码就解释完了,总之,就是上面的概念一,和概念二。
为了升华概念一,再引出一段代码:
#include<stdio.h> #include<iostream> using namespace std; int main() { int x, y, z; x = y = z = 0; ++x || ++y && ++z; cout << x << " " << y << " " << z; system("pause"); }
直接告诉你结果:
1 0 0;
具体为什么会是1 0 0 呢,我只知道结论,并不知道为什么,
结论就是,当逻辑或前为真,逻辑或之后所有东西会被短路,对,没错,是所有,不管之后有多少东西
即使是
++x || ++y && ++z || ++p && ++q || ++r
它都只会执行++x,之后的都不会执行。