C语言算符优先级记忆之我的观点
一共有十五个优先级: 同一优先级的运算符,运算次序由结合方向所决定
- () [] . -> (括号,成员排第一)
- ! ~ -(负号) ++ -- &(取变量地址)* (type)(强制类型) sizeof (单目运算排第二)
- * / % (乘除余三)
- + - (加减四)
- >> << (移位五)
- > >= < <= (关系六)
- == != (等于不等排第七)
- & (位“与”)
- ^ (”异或“)
- | (和位"或")三分天下八九十
- && (逻辑 ”与“)
- || (和”或“)十一和十二
- ?: (条件运算符)
- = += -= *= /= %= |= ^= &= >>= <<= (条件高于赋值)
- , (逗号优先级最低)
如果真的把15个等级都一清二楚记住了,我觉得你肯定会非常抓狂,再说也不可能完完全全非常精确地记住,因为人的记忆力是会衰减的,而且,每一门语言的运算符优先级都不太一样,记住C的,就会和Java,JavaScript,Python的搞混,说不定得不偿失。
那么我们平常编程,如果不敢保证哪个算符优先级更高,我们就用()括号吧。但是,如果我们不适当地记住一些优先级,那么看别人的不爱带括号的代码,那就容易看不懂。
总而言之,我们有必要适当地记一下运算符的优先等级。
我们看图,会发现:
- 最重要的一句话:括号和成员算符>单目>双目>三目(?:)>赋值运算符
- 再看双目运算符里的,我们最常用的无非就是乘、除、模、加、减了,既然在双目运算符里,最常用的符号是这些,那么其优先级也应该是最高的嘛。语言的设计要方便开发,最常用的符号优先级更高,可以减少我们使用()括号的频率,有利于开发,可读,想想也是非常通达情理、人性化的事情嘛,这个应该很好记住吧,哈哈。
- 接下来就是移位运算符和关系运算符啦,>> 、<< 高于 < 、> 、<= 、>= 高于 == 、!= ,我有一个不成文的记忆技巧那就是,你看到>和<这个两个符号,它的数量越多,等级就越高,你看<<和>>有两个,< 、> 、<= 、>=只有一个,而==和!=有零个。
- 再往下就是逻辑运算符了,按位与、按位异或、按位或(&、^、|) 高于 逻辑与、逻辑或(&&、||) ,按位X的运算速度远远快于逻辑X的运算速度,所以算符优先等级也更大。注意(按位非 ! 并不在按位X这里,因为按位非是单目运算符哦,要记住!)
- 然后就是按位与>按位异或>按位或>逻辑与>逻辑或,这个就用你自己的方法来记住呗,我也没啥好方法哈....
- 最后的最后,就是赋值运算符啦,既然是赋值,那可以这样想,我们正常来说,是不是应该把所有的运算都算完了,该做的事情都做了,最后才进行赋值呢?哈哈,没错,赋值运算符的等级是倒数第二低的,等级最低的是逗号(,)。