复杂表达式的求值的影响因素。
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序
两个相邻的操作符先执行哪个?取决于它们的优先级。如果两者的优先级相同,取决于它们的结合性。
是否控制求值顺序;
&&(逻辑与),||(逻辑或),?:(条件操作符) ,,(逗号)会影响求值顺序。
1.&&逻辑与
(表达式1)&&(表达式2) 当表达式1判断为假时,表达式2就不再判断,整体为假。
2.||逻辑与
(表达式1)||(表达式2) 当表达式1判断为真时,表达式2就不再判断,整体为真。
实例:
代码解读
复制代码
3.?:条件操作符
(表达式1)?(表达式2):(表达式3)当 表达式1成立,执行表达式2,表达式3不用看;当表达式1不成立,执行表达式3,表达式2不用看。
4.,逗号
(表达式1),(表达式2),(表达式3),……,(表达式n) 真正起到判断结果作用的是表达式n。
一些问题表达式
c
代码解读
复制代码
//表达式的求值部分由操作符的优先级决定。
//表达式1
a*b+c*d+e*f;
//表达式2
a + --a;
代码3–非法表达式
c
代码解读
复制代码
#include<stdio.h>
int main()
{
int i = 10;
i = i-- - --i * (i = -3) * i++ + ++ i;
printf("i=%d\n", i);
return 0;
}
在不同编译器中测试结果不同
代码4—错误代码
c
代码解读
复制代码
#include<stdio.h>
int fun()
{
static int count = 1;
return ++count;
}
int main()
{
int answer;
answer = fun() - fun() * fun();
printf("%d\n", answer);
return 0;
}
结果:-2或-10
我们只能确定-与*的优先级无法确定fun()的调用顺序
可能是4-2*3也可能是2-3 *4
代码5
c
代码解读
复制代码
#include<stdio.h>
int main()
{
int a = 1;
int b = (++a) + (++a) + (++a);
printf("%d\n", b);
return 0;
}
7018&x-orig-expires=1731302757&x-orig-sign=Nw76FH7BKsIVG7sESnHmFCLgT6I%3D) 为什么呢?
这段代码的第一个+在执行的时候,第三个++是否执行,这个是不确定的,因为依靠操作符的优先级和结合性是无法决定第一个+和第三个前置++的先后顺序