c语言 乱序,C语言中的顺序点

本文探讨了C语言中函数参数求值顺序和运算符优先级的不确定性,以及顺序点的概念。举例说明了k=k+++k++; 和if(a--&&a)语句的执行流程,强调了在编写代码时要注意这些潜在的顺序问题,以避免意外行为。同时,提到了函数调用时实参求值的顺序点,并分析了一段包含这些特性的代码示例。
摘要由CSDN通过智能技术生成

C语言盲点

1、函数参数的求值顺序依赖于编译器,例如f(a,a++);是先求a++还是求a不一定

2、C语言中的大多数运算符对其操作数的求值顺序也依赖于编译器

警告

int i = f() * g();这里先求f()还是先求g()不一定,所以不能写出要先实现f(),在实现g()的函数;

程序中的顺序点

定义:

指程序执行过程中修改变量值的最晚时刻。

有哪些顺序点

1、每个完整表达式结束后,即分号后面

2、&&,||,三木运算符(?:),以及逗号表达式的每一个运算对象计算之后

3、函数调用中对所有实际参数的求值完成之后(进入函数体之前)

考虑以下代码输出值

#include #include int main(int argc, char *argv[]){ int k = 2; int a = 1; k = k++ + k++; printf('k = %d\n',k); if(a--&&a) { printf('a = %d\n',a); } system('PAUSE'); return 0;}

分析:

1、k = k++ + k++;的顺序点在‘ ; ’后,所以k++到真正去修改内存值是在分号后面,所以编译器的行为是先k =2+2;之后k自增两次

2、在遇到&&时候,每一个运算对象之后就是一个顺序点所以a–执行后就是一个顺序点,所以这是就去内存修改了a的值,所以就是if(1&&0)所以不执行printf

再考虑以下代码:stream-6715888457031486220?did=62765621841&k=b74cf74ba321c94b&t=1564279558&uid=98716331669

也就是 i =2,j = 1, k = 2

之前提到实参在传入函数之前对实参的求值完成之后是一个顺序点,也就是在进行值传递的时候K已经是2了,

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值