【转】运算符优先级
由于一直弄不清楚运算符的优先级,所以找了这么一篇文章过来学习
本文仅适用于怎么也记不住运算符优先级顺序的人,已经记住了的就飘过吧 ~~
估计很多初学 C 语言的人都会碰到这么一个问题: C 运算符太多太复杂,优先级顺序难记,背了还是忘。那怎么办呢?
在实际写程序的过程中倒还好,实在不知道哪个先哪个后,咱就给它加个括号,而且给程序中添加适当的括号也是非常推荐,值得表扬的,是一个很好的编程习惯。
可是问题又来了,考试(比如说期末考试、等级考试。。)的时候出卷老师可不跟你来这套,他就是不用括号,然后就看着你得意地笑:小样,猜个答案吧 ……
结果往往是以我们的失败而告终!
像我标题所说的,如何快速、准确、轻松地记住 C 语言的运算符优先级顺序呢?(下面的内容都出自《 C Traps and Pitfalls 》,不过我用简单点的语言给概括一下)
首先来张图 ,别晕,仔细看看还是层次分明的
咱们就来解释一下这张图的内容,下面就单刀直入,不废话了
这是 C 语言中所有运算符优先级的表,左边一个大箭头一看就知道:从上到下,优先级依次降低;
然后看整体最粗的蓝色线,它将所有的运算符分为六个部分,最上面 4 个优先级最高,书上说它们其实不算严格意义上的运算符,记住就行了,应该没啥问题;接下来有点多了,不过他们有个通称就是 “ 单目运算符 ” ;再接下来最多的那个,怎么记呢? “ 双目运算符 ” ;再接下来这一个你肯定猜到了: “ 三目运算符 ” ;紧随其后的就是赋值运算符了,注意这里包涵很多种的赋值运算符: = 和 op= ;逗号运算符优先级最低;
上面的弄懂了的话,对于运算符优先级的掌握就成功一大半了,其中要注意单目、三目和赋值运算符的结合性是自右向左的
然后就到了中间最大一块了,如何记住双目运算符之间的优先级呢?四个字:数移关逻。数学 > 移位 > 关系 > 逻辑,简单吧?
数学运算符,小学生都知道,先乘除(这里加个模)后加减;
移位就没啥说的了;
关系运算符中,大小判断优于等于判断;
逻辑运算符下面又有点小复杂 ,黄色的线将上下一分为二,按位逻辑 > 顺序逻辑;同时逻辑与 > 逻辑或;按位异或 ^ 居于与或之间。
所有的 C 语言运算符优先级和结合性都介绍完了,简单吧?
如果你以前没记住又看得比较快,估计到这里你还是没记住,没关系,无穷循环,记住了就 break ;
给个小例子
在使用指针的时候经常碰到诸如 *p++ 、 (*p)++ 这样的东东,现在是不是一眼就看明白了? * 和 ++ 都是单目运算符,优先级相同,自右向左 ……