笔记-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");
} 


预测下结果:

-->

-->

-->

-->

-->

-->

上结果:


不知道和你的想象的结果一样吗?

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,之后的都不会执行。

最后给出一个链接


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值