复杂表达式的求值的影响因素。

91 阅读2分钟

复杂表达式的求值的影响因素。

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序

两个相邻的操作符先执行哪个?取决于它们的优先级。如果两者的优先级相同,取决于它们的结合性。

微信图片_20241110123501.png 是否控制求值顺序;&&(逻辑与),||(逻辑或),?:(条件操作符),(逗号)会影响求值顺序。

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

屏幕截图 2024-11-10 122601.png 代码3–非法表达式

c
 代码解读
复制代码
#include<stdio.h>
int main()
{
	int i = 10;
	i = i-- - --i * (i = -3) * i++ + ++ i;
	printf("i=%d\n", i);
	return 0;
}

在不同编译器中测试结果不同

屏幕截图 2024-11-10 125101.png 代码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;
}

微信图片_20241110132222.jpg

7018&x-orig-expires=1731302757&x-orig-sign=Nw76FH7BKsIVG7sESnHmFCLgT6I%3D) 为什么呢?

这段代码的第一个+在执行的时候,第三个++是否执行,这个是不确定的,因为依靠操作符的优先级和结合性是无法决定第一个+和第三个前置++的先后顺序