C语言中的顺序点
来源:互联网 发布:神探夏洛克第四季知乎 编辑:程序博客网 时间:2024/05/17 00:52
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 = %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
再考虑以下代码
#include <stdio.h>#include <stdlib.h> int f(int i, int j){ printf("%d, %d\n", i, j);}int main(int argc, char *argv[]){ int k = 1; f(k, k++); printf("%d\n", k); system("PAUSE"); return 0;}输出结果//2,1//2
也就是 i =2,j = 1, k = 2
之前提到实参在传入函数之前对实参的求值完成之后是一个顺序点,也就是在进行值传递的时候K已经是2了,
0 0
- c语言中的顺序点
- C语言中的顺序点
- c语言中的 顺序点
- c语言中的求值顺序点
- c语言中的求值顺序
- C语言中的序列点
- C语言实现数据结构中的顺序表
- C语言实现数据结构中的顺序栈
- C/C++ 语言中的表达式求值顺序
- 【C语言复习(二十八)】函数本质、顺序点
- 几个C语言中的易混淆点
- C语言中的序列点和副作用
- C语言中的序列点和副作用
- C语言中的序列点和副作用
- c语言中的数组名注意点
- C语言中的序列点
- Objective-C语言中的点语法
- 浅谈C/C++中的顺序点和副作用
- 解决select2 在easyui dialog中不显示下拉列表的问题
- POJ 1163 The Triangle
- 接口(interface)那点事
- android Wearable-Accessing the Wearable Data Layer and Syncing Data Items
- ios7以后如何实现App长时间后台运行
- C语言中的顺序点
- 装饰模式(Decorator)
- Spring+EhCache缓存实例(详细讲解+源码下载)
- wordpress域名迁移相关配置
- u699The Falling Leaves
- Excel添加SHA256计算函数
- 从Theano到Lasagne:基于Python的深度学习的框架和库
- 利用oop编程写队列和堆栈
- scanf