C语言优先级
1 如何理解C语言优先级,需要背下来吗?
很多初学者都是在背C语言优先级顺序表和结合型方式(左结合or右结合),其实不需要,如何就背下来的话,那么把++、.、->、[]这些混在一起,这时继续背?还是必须解决这个问题?
看似表的内容很多,其实你只需要记住一点就好了,下面我和大家分享下。
2 记住最高优先级的四个
我只把这四个作为最高优先级,分别是
()
[]
.
->
为什么这四个操作符优先级最高,有没有更高的优先级运算符?或者纯粹的有什么运算符能把这四个运算符给割裂开?
答案:不会,也是不可能。C++有一个,之后分析。原因如下
- () 是函数调用符,你需要调用函数时,难道需要被割裂开,被其他运算符抢先,出现这个我就认为这里将有一个函数调用,绝不可能是其他的
- []是数组调用符,你需要使用数组时,难道需要被割裂开,被其他运算符抢先,出现这个我就认为这里将有一个数组,绝不可能是其他的
- .是点运算符,表达结构体内成员,,难道需要被割裂开,被其他运算符抢先,出现这个我就认为这里将有一个组合数据,绝不可能是其他的
- ->是点运算符,表达结构体内成员,,难道需要被割裂开,被其他运算符抢先,出现这个我就认为这里将有一个组合数据,绝不可能是其他的
仔细想想,确实是这样的,上面的四个运算符是不可分割开,它们出现下意识就知道是什么东西,我们不会想到其他东西。
3 ++ – 属于第一还是第二梯队
其实+++、–有两种方式,即前缀和后缀,后缀是第一梯队,前缀是第二梯队,其实完全不用记,这东西就是就近原则
比如,以后缀的例,当然前缀和后缀都分不开就没多大意思了
- xxx++
- (xxx … yyy)++
第一种++作用xxx,先用后加
第二种,作用于整体(xxx … yyy),先用后加
它们总是结合最近的东西
4 * & 属于第二梯队
指针和取地址是第二梯队,第二梯队都是右结合性,其他的都不用记了,因为你不会搞错的。
5 几个案例
举一个很常见的案例,main函数的一个参数
类型是:char *argv[];
*++argv[0]
分析:
- 首先四大最高优先级,发现[],出现数组,即argv[0],指向字符串的第一个元素
- 之后考虑++或者–判断是前缀还是后缀,是先取值还是先+1? 就近原则,即++argv[0],指向字符串的下一个元素,这里的最近的元素是argv[0]?因为是第一步的结果,是肯定的
- 最后剩下*,当然是字符串的下一个元素的值[1]
总结,先看四大最高优先级,之后考虑++/–的前缀后缀形式,之后*和&
(*++argv)[0]
- 首先四大最高优先级,发现(),[],显然是一个数组,但是这个数组作用于前面的整体,也就是*++argv,所以接下来只会对*++argv进行分析
- 之后考虑++或者–判断是前缀还是后缀,是先取值还是先+1? 就近原则,++argv,即指向下一个字符串
- 最后*,即*++argv是下一个字符串,
- 总体(*++argv)[0],表达的是下一个字符串的[0]
备注:其实这个等价于**++argv
总结,先看四大最高优先级,之后考虑++/–的前缀后缀形式,之后*和&
6 总结
如何分析?
- 先看四大最高优先级
- 之后考虑++/–的前缀后缀形式
- 之后*和&
为什么++/–会放在第二点考虑?为什么不把它放在第一梯队?
因为后缀是第一梯队,前缀是第二梯队。然而,实际上并没有把它特意归为第一、二,前后缀形式很容易让人分辨其效果
为什么*和&会放在第三点考虑?
因为一个括号就该变了它结合顺序,说明有更高的优先级破坏了它,这也印证四大最高的优先级符号是毫无疑问的。
其他算术、比较等,大家一看就懂了,没什么好分析的
7 C++在四大最高优先级上还有一个作用域解析符::
可以理解,::表达隶属于,难道应该被拆开吗?要确实表达是这个类的!!!