众嘲炮:如何记C语言的运算符优先度

2019-12-27 18:54发布

本帖最后由 TBG3 于 2017-4-6 11:46 编辑

好像本论坛大多数程序员不记优先度,用括号来表达。当然是一种解决办法。但是你读别人的程序时呢? 人家不加括号你怎么办?

记的方法,扎实的办法就是死记,效果最好,这里就不做详细介绍了。

就介绍一种简单的方法,就五条。

一是单目运算符,包括数组,结构,++ -- ~ !之类,最优先。 因为神是唯一的神,所以好好敬服他吧。

第二是运算次优先,+ - * / <<  >>,因为资本主义世界,你要算清楚,不然肯定亏。注意这里面移位最不优先,因为人都不乐意地位变化。

第三是关系优先于逻辑,所以 > < == != 优先于与或非,与或非里面,个数多的,优先单个的,也就是说 & | 优先于 && ||

第四就是 赋值最不优先,因为等你都做出来之后,才会赋予你报酬。注意,因为 ? :里面有关系,所以在赋值里面最优先。

第五条是 单目里面的优先度,和2,3,4里面的优先度是一样一样的,赋值里面的优先度也跟2,3是一样一样的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
AWEN2000
1楼-- · 2020-01-02 14:35
TBG3 发表于 2017-4-6 12:15
说明你记得很不清楚。

有时候加括号能增强可读性,还避免错误。
非要搞复杂的优先度,你以为是考试做题呢。
有点像孔乙己的茴有几种写法一样
vuo50z
2楼-- · 2020-01-02 19:37
 精彩回答 2  元偷偷看……
shangdawei
3楼-- · 2020-01-02 19:51

()                              
lixin91985
4楼-- · 2020-01-02 23:31
takashiki 发表于 2017-4-6 14:41
您给解释下到底怎么回事,自增就他娘的一个坑,根本就不按套路出牌

指针是 最高优先级的。

这个表达式 经常用的。

其余的能加括号就加括号。

不同的编译器 对运算符的先后都可能不一样。如果你开了优化,结果你永远都想不到。
wzd5230
5楼-- · 2020-01-03 00:54
基本上不记,遇到多个运算就是()对待!简单粗暴
takashiki
6楼-- · 2020-01-03 02:33
lixin91985 发表于 2017-4-6 21:05
指针是 最高优先级的。

这个表达式 经常用的。

事实上,他这个表才是正确的,但是从这个表上直接推算根本和我们想象的大相径庭。
聪明的编译器可能会编译成:*pDst = *pSrc; pDst ++; pSrc ++;
但是符合标准的编译器(完全没有优化)应该编译成这个样子:
加括号的等价:*(pDst++) = *(pSrc++);
展开为:
  1. pTempDst = pDst;                          // 后缀自增、自减会产生临时变量(寄存器变量)
  2. pDst ++;
  3. pTempSrc = pSrc;
  4. pSrc ++;
  5. *pTempDst = *pTempSrc;
复制代码

很遗憾,您的回答错误。如果指针是最高优先级,那么*pDst++会等价于 (*pDst)++,显然不是你想要的。
我只想说,后缀自增自减其实是有坑的,TM的坑还不浅!

一周热门 更多>