c语言中的求值顺序点

求值顺序点

表达式求值规则的核心在于  “顺序点( sequence point )”

    顺序点的意思是在一系列步骤中的一个结算的点,语言要求这一时刻的求值和副作用全部完成,才能进入下面的部分。在C/C++中只有以下几种存在顺序点:
    1)分号;
    2)未重载的逗号运算符的左操作数赋值之后(即''处)
    3)未重载的'||'运算符的左操作数赋值之后(即'||'处);
    4)未重载的'&&'运算符的左操作数赋值之后(即“&&”处);
    5)三元运算符'? : '的左操作数赋值之后(即''处);
    6)在函数所有参数赋值之后但在函数第一条语句执行之前;
    7)在函数返回值已拷贝给调用者之后但在该函数之外的代码执行之前;
    8)每个基类和成员初始化之后;
    9)在每一个完整的变量声明处有一个顺序点,例如int i, j;中逗号和分号处分别有一个顺序点;
    10for循环控制条件中的两个分号处各有一个顺序点。
    对于任意一个顺序点,它之前的所有副作用都已经完成,它之后的所有副作用都尚未发生。
    在两个顺序点之间,子表达式求值和副作用的顺序是不同步的。如果代码的结果与求值和副作用发生顺序相关,称这样的代码有不确定的行为(unspecified behavior.而且,假如期间对一个内建类型执行一次以上的写操作,则是未定义行为.
    任意两个顺序点之间的副作用的发生顺序都是未定义的.
    如:
    x=x++;
    该表达式只有一个顺序点,在该顺序点之前有2个副作用,一个是自增,一个赋值,这两个副作用发生的顺序是未定义的,即自增运算和赋值运算哪一个先执行是没有被定义的(注意这个顺序跟运算符的优先级是无关的,注意理解运算符优先级的含义),这个执行次序交由编译器厂商去自行决定,因此对于不同的编译器可能会得出不同的结果。
    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char *argv[])
    {
    int i=0;
    int m=(++i)+(++i)+(++i)+(++i);
    printf("%d %d\n",m,i);
    system("pause");
    return 0;
    }

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值