众所周知,在C/C++考试中,经常会出现一些运算符丢到一起,形式从来不会在程序里出现,这样阴间的题来检验(恶心)你对运算符优先级的理解。下面给大家梳理一下这些题目的大概思路。
首先,我们有一个运算符优先级和结合性的表,我们需要大概了解,我们来捞出来在考试中出现频率最高的部分。(其余部分想了解可以在CSDN很容易找到)
1.() [] 后置++ 后置--
2. ! 前置++ 前置-- 正负号
4. 乘除运算,取模运算
5.加减运算
7.< <= > >=
8.== !=
12.&&
13.||
14. ? :
15.各种赋值(= += -= ......)
16.逗号
看上去很多,其实并不难记忆,我按照大概需要记忆的顺序划分了颜色,接下来带大家捋一遍。
1.首先最开始我们直接看有无括号,它的优先级是最高的,先算括号里!!!
2.我们看是否有 !(它经常在考试中出现) ,然后再进行++,-- 的运算。
3.按从左往右的顺序进行数学符号的运算(先乘除取模后加减)
4.进行比较的运算,先进行有 > < 号的运算
5.逻辑运算符的运算,先&&后||
6.三目运算符,从右向左计算
7.赋值,从右向左计算
8.逗号
当我说到这里,你大概率还会感到困惑,我们看几道题回来相信你就融会贯通了。
1.先给大家看一个有点跑题的(
int (*p)[4] ; 我们初始化一个数组指针,要加括号,让p先与* 结合,它本质是指针。
如果不加,
int* p[4]; 则表示指针数组,先与[]结合,本质上是数组,它内部每一个元素都存放着int*类型的指针。
2.已知 a=10,b=15,c=1,d=2,e=10,则表达式 a++&&e++&&c++的值为
题中只有逻辑或和++运算,++运算在执行之后才进行,那么实际上就是
10&&10&&1 ,从左向右进行计算,最后得1
3.设 a=3,b=4,c=5,则表达式!(a+b)+c-1&&b+c/2 的值为
首先算括号里的,a+b = 7,再算!运算,得0;之后两面算数运算,得到4&&6,结果为1
4.执行下面程序中的输出语句后,输出的值是:( ),
由于逗号的优先级最低,我们首先执行算数运算,逗号表达式最后一个为输出结果。那么a = 15,最后 a + 5 = 20,输出为20,中间执行 15 * 4实际没啥意义
这题主要看++和--的理解,第一个判断语句比较的是5>5,不成立,但是这时m变成6,然后else中将6输出,之后如果有在调用m才为5,选A
6.
7.下面还有一些习题,大家可以自行练习。
相信看过这些题目后,你再回去看一遍这些优先级的顺序,脑子里就大概有一个清晰的框架了。