C语言中的运算符优先级问题,一般是不要求我们记的,但如果能记住,对快速理解代码和编程是有很大帮助的;若能快速记住,何乐而不为呢?
如果你喜欢,建议先下载我整理的运算符优先级pdf文档(http://download.csdn.net/detail/n289950578/7964209),对照一起看,更有助于理解。
1、优先级:
为了理解方便,将优先级分为六大类,速记为《非123赋》:
非运算符 () [] . ->;
单目运算 (!&* 右->左);
双目运算 (左->右,最复杂,最重要部分);
三目运算 (X?A:B 右->左);
赋值运算 (*= 右->左);
逗号运算 (, 左->右);
除了双目运算,其他的每一大类都代表了一个优先级,自己合并了一首双目运算的打油诗,如下:
乘除/加减/左右移;
大等小等/等不等;
位与/异或/按位或;
逻辑与,/逻辑或。
//取余运算和除是相同的原理,为了方便组合诗,省去,理解就行
2、结合方向:
所谓的运算结合方向,指的是运算符优先级相同的时候,优先计算左边的还是右边的。
所有的双目运算和逗号运算都是从左至右,剩余的单目运算,三目运算和赋值从右至左;这个根本不用记,下面说明怎么去理解就行了。
单目:所有的单目运算都只有一个操作数,运算需要形成(运算符+操作数)的模型(a++,a--除外),需先确定操作数,再进行计算。所有的操作数都在右边从表面上看是先确定操作数,再结合运算符,即自右至左;这里的单目运算含了sizeof()和强制类型转换()。
双目:双目运算的时候,必须是(操作数+运算符+操作数)的模型,运算前必须先确定两个操作数,再结合操作符进行计算,按常规方向,即从左往右的顺序。
三目:X?Y:Z三目运算顺序为,先计算X,如果X的结果为真,再执行Y,否则执行Z。所谓右到左方向,仅限于多个嵌套结合时,很多人会误解右到左的过程,将计算方向理解为先Z再Y最后X,我之前就是这么理解的。
X?a:b?aa:bb => X?a:(b?aa:bb)而不是(X?a:b)?aa:bb, (使用VC6.0单步汇编跟踪C得出的结论)。当然,实际使用当中,为避免误解,必须加上括号,没有人会这样写的,所以如果你不高兴,三目的方向性也可以不记。
赋值:可以像单目一样理解,只有先确定操作数,再结合运算符,才可以给目标对象赋值,自然也就自右至左了。
逗号:逗号运算没有任何特别的需要,按照常规顺序走就行,故自左往右的顺序。
当然,每个人的理解思维是不一样的,我这里只是分享了我的理解方法,若能结合自己的思维理解,其实是最快的,重在理解。非常欢迎大伙将自己的理解思路share出来!转载请注明来源:http://blog.csdn.net/n289950578/article/details/39502367
原文地址:http://blog.csdn.net/n289950578/article/details/39502367