如何理解C/C++语言的优先级,需要背吗?

1 如何理解C语言优先级,需要背下来吗?

很多初学者都是在背C语言优先级顺序表和结合型方式(左结合or右结合),其实不需要,如何就背下来的话,那么把++、.、->、[]这些混在一起,这时继续背?还是必须解决这个问题?
看似表的内容很多,其实你只需要记住一点就好了,下面我和大家分享下。

2 记住最高优先级的四个

我只把这四个作为最高优先级,分别是

()
[]
.
->

为什么这四个操作符优先级最高,有没有更高的优先级运算符?或者纯粹的有什么运算符能把这四个运算符给割裂开?
答案:不会,也是不可能。C++有一个,之后分析。原因如下

  1. () 是函数调用符,你需要调用函数时,难道需要被割裂开,被其他运算符抢先,出现这个我就认为这里将有一个函数调用,绝不可能是其他的
  2. []是数组调用符,你需要使用数组时,难道需要被割裂开,被其他运算符抢先,出现这个我就认为这里将有一个数组,绝不可能是其他的
  3. .是点运算符,表达结构体内成员,,难道需要被割裂开,被其他运算符抢先,出现这个我就认为这里将有一个组合数据,绝不可能是其他的
  4. ->是点运算符,表达结构体内成员,,难道需要被割裂开,被其他运算符抢先,出现这个我就认为这里将有一个组合数据,绝不可能是其他的

仔细想想,确实是这样的,上面的四个运算符是不可分割开,它们出现下意识就知道是什么东西,我们不会想到其他东西。

3 ++ – 属于第一还是第二梯队

其实+++、–有两种方式,即前缀和后缀,后缀是第一梯队,前缀是第二梯队,其实完全不用记,这东西就是就近原则
比如,以后缀的例,当然前缀和后缀都分不开就没多大意思了

  1. xxx++
  2. (xxx … yyy)++
    第一种++作用xxx,先用后加
    第二种,作用于整体(xxx … yyy),先用后加
    它们总是结合最近的东西

4 * & 属于第二梯队

指针和取地址是第二梯队,第二梯队都是右结合性,其他的都不用记了,因为你不会搞错的。

5 几个案例

举一个很常见的案例,main函数的一个参数

类型是:char *argv[];

*++argv[0]

分析:

  1. 首先四大最高优先级,发现[],出现数组,即argv[0],指向字符串的第一个元素
  2. 之后考虑++或者–判断是前缀还是后缀,是先取值还是先+1? 就近原则,即++argv[0],指向字符串的下一个元素,这里的最近的元素是argv[0]?因为是第一步的结果,是肯定的
  3. 最后剩下*,当然是字符串的下一个元素的值[1]

总结,先看四大最高优先级,之后考虑++/–的前缀后缀形式,之后*和&

(*++argv)[0]
  1. 首先四大最高优先级,发现(),[],显然是一个数组,但是这个数组作用于前面的整体,也就是*++argv,所以接下来只会对*++argv进行分析
  2. 之后考虑++或者–判断是前缀还是后缀,是先取值还是先+1? 就近原则,++argv,即指向下一个字符串
  3. 最后*,即*++argv是下一个字符串,
  4. 总体(*++argv)[0],表达的是下一个字符串的[0]

备注:其实这个等价于**++argv

总结,先看四大最高优先级,之后考虑++/–的前缀后缀形式,之后*和&

6 总结

如何分析?

  1. 先看四大最高优先级
  2. 之后考虑++/–的前缀后缀形式
  3. 之后*和&

为什么++/–会放在第二点考虑?为什么不把它放在第一梯队?
因为后缀是第一梯队,前缀是第二梯队。然而,实际上并没有把它特意归为第一、二,前后缀形式很容易让人分辨其效果

为什么*和&会放在第三点考虑?
因为一个括号就该变了它结合顺序,说明有更高的优先级破坏了它,这也印证四大最高的优先级符号是毫无疑问的。

其他算术、比较等,大家一看就懂了,没什么好分析的

7 C++在四大最高优先级上还有一个作用域解析符::

可以理解,::表达隶属于,难道应该被拆开吗?要确实表达是这个类的!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值