笔记-C/C++序列点

下面的为自己实践得出的结论,并非官方文档


看段代码开篇(环境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,之后的都不会执行。

最后给出一个链接


猜你喜欢

转载自blog.csdn.net/Skying_/article/details/80241818