深入辨析c语言中运算符的优先级问题

一.基本的运算符的优先级(谭浩强第四版)

深入辨析c语言中运算符的优先级问题_第1张图片

二.常用的运算符的一般性总结

当我们计算一个复杂的算术表达式时,其构成最多的便是算术运算符,关系运算符和逻辑运算符(&&,||)。 注意这几种运算符的结合性都是从左到右(注意逻辑非的结合性为从右到左),优先级的大小为 !(逻辑非运算符) > 算术运算符 > 关系运算符 > &&,|| (逻辑与运算符和逻辑或运算符) 。进一步研究这些常见的运算符

1.算术运算符

构成 +, - , * , / , %
优先级 * , / , % 的优先级高于 + , -
结合性 从左到右

2.关系运算符

构成 < , <= , > , >= , == , !=
优先级 < , <= , > , >= 优先级相同高 , == , != 优先级相同低
结合性 从左到右

3.逻辑运算符

构成 && , 逻辑或 , !
优先级 !(最高) , &&(优先级居中) , 逻辑或(优先级最小)
结合性 !的结合性为从右到左, 逻辑与, 逻辑或的结合性为从左到右

特别注意:&&,||两个逻辑运算符的短路性,当我们计算关于短路与(&&)的表达式时,形如: (表达式1) && (表达式2) 若表达式1的值为0(即为假),则整个式子的值必将为0(为假),系统将不会再去计算表达式2,直接输出0。同理对于短路或(||),形如: (表达式1) || (表达式2),若表达式1的值为1(为真,可以是不为0的任意一实数)

举例

1.设 a= 2,b=3,c=4,则表达式 a+b A. 5
B. 8
C. 0
D. 1

解答:C
根据上述算术运算符的优先级该表达式的计算顺序为
深入辨析c语言中运算符的优先级问题_第2张图片

2.设有 int a=1,b=2,c=3,d=4,m=2,n=2;执行 (m=a>b) && (n=c>d) 后n的值为()
A. 0
B. 1
C. 2
D. 3

解答:C
这里需要明确的是"()“运算符的优先级最高,且结合性为"从左到右”,赋值运算符的优先级最低。所以该表达式的计算顺序为
深入辨析c语言中运算符的优先级问题_第3张图片

当我们的复杂表达式只涉及到如上几种运算符时,我们只需牢牢把握各运算符之间的优先级即可,但是,当我们在做此类题目的时候,往往遇到的不仅仅只包含以上三种运算符,下文笔者将对这些"变种表达式"做出一一分析。

三.复杂的算术表达式

1.涉及自增运算符(++)和自减运算符(- -)的表达式

(1)假设初始时a,b的值均为1,a=b++; a = ++b; a=b–; a = --b; 这几个表达式的区别
a=b++; 先将b的赋给a,然后b再自增1.执行完此语句后a的值仍然为1,b的值为2。
a=++b; 先将b的值自增1,然后把b的值赋给a的值,执行完此语句后,a的值变为2,b的值变为2。
a=b–; 先将b的值赋给a,然后b再自减1,执行完此语句后,a的仍然为1,b的值变为0。
a=–b; 先将b的值减1,然后再将b的值赋给a,执行完此语句后,a的值变为0,b的值变为。

注意:①运算符++和运算符–只能由于变而不能用于常量或表达式,比如5++和(a+b)++都是错误的
②虽然自增运算符和优先级高于算术运算符和逻辑运算符,但当我们使用类似、a++的运算符时,a的自增操作往往是在该语句结束后才将a的值加1,表现为一种"伪优先".但使用类似++a的表达式时,符合其优先级规律

(2)例子

①设a=1,b=2,c=3 计算下列表达式的值 a–&&b+c>a = ____

解答:1
该表达式的计算顺序为:
深入辨析c语言中运算符的优先级问题_第4张图片

②设a=1,b=2,c=3 计算下列表达式的值 c= - -a&&b+c>a 为____

解答:0
该表达式的计算顺序为:
深入辨析c语言中运算符的优先级问题_第5张图片

③假定变量a=1,b=2,c=3,则表达式 c==b++>a&&a++, a+b的值为()
A. 2
B. 3
C. 4
D. 5

解答:C
先执行关系表达式c==b,显然不成立,由于为短路&&,所以将不会执行后面的表达式,整个表达式的值为0,整个表达式执行完毕后,b的值加1,变为3,所以a+b的值为4

2.涉及强制类型转换和自动类型转换的表达式

(1)强制类型转换运算符"(类型)“的优先级是高于算术运算符和关系运算符以及逻辑运算符&&,||的,其结合性为"从右到左”
(2)自动类型转化涉及较多的往往是整数和字符之间,字符和字符之间的运算,这时字符类型的数据要转换为对应的ascii码值,然后在进行相应的运算

(3)例子
①若t为int类型,表达式,t=1, t+=5.2, t++的值为()
A. 6
B. 7
C. 6.2
D. 7.2

解答:A
由于t为int类型的数据,当执行完语句"t += 5.2 "的值后,t的值为6,然后t++表达式的仍然为6,只有执行完t++语句后,t的值才为7.

②以下选项中表达式为1的是()
A. 1-‘0’
B. 1-’\0’
C. ‘1’ - 0
D. ‘\0’ - 0

解答:B
A. 计算表达式1-‘0’时,字符’0’先转换为其对应的ASCII码值48,然后执行"1-48",答案为-47,不符合
B. 计算表达式1-’\0’时,字符’\0’先转换为其对应的ASCII码0,然后执行表达式式"1-0",答案为1,符合。’\0’字符用于标识字符串末尾,本质为控制字符"NULL",其Ascii码值为0
C.计算表达式’1’-0时,字符’1’先转换为其对应的ASCII码值49,然后计算表达式"49-0",答案为49,不符合
D.计算表达式’\0’ - 0时,字符’\0’先转换为其对应的ASCII码值,然后计算表达式"0-0",答案为0,不符合

注意掌握一些常见字符的ASCII码,比如,’\0’为0,'0’为48,'A’为65,'a’为97

③假定int a=0,b=1,表达式: !(a=‘0’) && b–,a+b的值为()
A. 0
B. 1
C. 48
D. 49

解答:49
算术表达式的计算顺序为:先计算括号内的表达式,字符’0’转换为其对应的ASCII码值48,然后将48赋给a,然后执行逻辑非运算,得表达式
!(a=‘0’)的值为0,由于为短路与,将不会执行逻辑与后面的表达式,所以a+b的值为49

3.赋值运算符的连等式
(1)注意赋值运算符的优先级在所有运算符的优先级中仅大于逗号运算符(","),其结合性为"自右向左"

(2)例子

①表达式 a+=a-=a=9 的值为___

解答:0
首先计算a=9,然后a-=9得a的值为0,然后执行a+=0,最后a的值为0,即该表达式的值为0

4.带有指针运算符的表达式
(1) *p++; 与 *(p++); 注意++和指针运算符同优先级,以上两个表达式均表示"先引用p的值,然后再使p的值自增1"。
(2) *(++p); 表示先将p自增1,然后引用p的值。
(3) ++(*p); 表示将p所指向的值自增1

你可能感兴趣的:(C/C++,c语言)