C语言盲点
1、函数参数的求值顺序依赖于编译器,例如f(a,a++);是先求a++还是求a不一定
2、C语言中的大多数运算符对其操作数的求值顺序也依赖于编译器
文章插图
警告
int i = f() * g();这里先求f()还是先求g()不一定,所以不能写出要先实现f(),在实现g()的函数;
程序中的顺序点
定义:
指程序执行过程中修改变量值的最晚时刻 。
有哪些顺序点
1、每个完整表达式结束后,即分号后面
2、&&,||,三木运算符(?:),以及逗号表达式的每一个运算对象计算之后
3、函数调用中对所有实际参数的求值完成之后(进入函数体之前)
考虑以下代码输出值
#include <stdio.h>#include <stdlib.h> int main(int argc, char *argv[]){ int k = 2; int a = 1; k = k++ + k++; printf("k = %dn",k); if(a--&&a) { printf("a = %dn",a); } system("PAUSE"); return 0;}分析:
【C语言中的顺序点】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了,
*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜 。
推荐阅读
- 如何冲泡品尝金骏眉
- 原来华为手机自带翻译功能,1秒按下这个键,就能翻译多国语言
- C语言如何操作MySQL数据库?
- 淘宝购物车顺序能调吗,淘宝购物车商品排序能上下移吗
- go语言ide开发工具 go语言编译器哪个好用
- 如何辨别红茶中的假金花霉变茶与金花茶区别
- 盗墓笔记中的黑眼睛镜 盗墓笔记里的黑眼镜是什么人
- 简单区分葡萄酒中的“三类香气”
- 关于房屋租赁中的印花税,你了解吗?
- 本文介绍了红茶中的天顶是个历史瑰宝 它的功能和作用