C语⾔中的顺序点
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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。