c++_运算符的优先级和结合性

上传人:琴**** 文档编号:19520639 上传时间:2017-11-19 格式:DOC 页数:9 大小:57.50KB
返回 下载 相关 举报
c++_运算符的优先级和结合性_第1页
第1页 / 共9页
c++_运算符的优先级和结合性_第2页
第2页 / 共9页
c++_运算符的优先级和结合性_第3页
第3页 / 共9页
c++_运算符的优先级和结合性_第4页
第4页 / 共9页
c++_运算符的优先级和结合性_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《c++_运算符的优先级和结合性》由会员分享,可在线阅读,更多相关《c++_运算符的优先级和结合性(9页珍藏版)》请在金锄头文库上搜索。

1、c/c+ 运算符的优先级和结合性 ZZ 2010-05-18 15:29PrecedenceOperator Description ExampleAssociativity1()-.:+-Grouping operatorArray accessMember access from a pointerMember access from an objectScoping operatorPost-incrementPost-decrement(a + b) / 4;array4 = 2;ptr-age = 34;obj.age = 34;Class:age = 2;for( i = 0; i

2、 0; i- ) .left to right2!+-+*&(type)sizeofLogical negationBitwise complementPre-incrementPre-decrementUnary minusUnary plusDereferenceAddress ofCast to a given typeReturn size in bytesif( !done ) .flags = flags;for( i = 0; i 0; -i ) .int i = -1;int i = +1;data = *ptr;address = &obj;int i = (int) flo

3、atNum;int size = sizeof(floatNum);right to left3 -*.*Member pointer selectorMember pointer selectorptr-*var = 24;obj.*var = 24;left to right4*/%MultiplicationDivisionModulusint i = 2 * 4;float f = 10 / 3;int rem = 4 % 3;left to right5 +- AdditionSubtraction int i = 2 + 3;int i = 5 - 1; left to right

4、6 Bitwise shift leftBitwise shift rightint flags = 33 1;left to right7 =Comparison less-than-or-equal-toComparison greater-thanComparison geater-than-or-equal-toif( i 42 ) .if( i = 42 ) .right8 =!=Comparison equal-toComparison not-equal-toif( i = 42 ) .if( i != 42 ) .left to right9 & Bitwise AND fla

5、gs = flags & 42; left to right10 Bitwise exclusive OR flags = flags 42; left to right11 | Bitwise inclusive (normal) OR flags = flags | 42; left to right12 & Logical ANDif( conditionA & conditionB ) .left to right13 | Logical ORif( conditionA | conditionB ) .left to right14 ? : Ternary conditional (

6、if-then-else) int i = (a b) ? a : b; right to left15=+=-=*=/=%=&=|=Assignment operatorIncrement and assignDecrement and assignMultiply and assignDivide and assignModulo and assignBitwise AND and assignBitwise exclusive OR and assignBitwise inclusive (normal) OR and assignBitwise shift left and assig

7、nBitwise shift right and assignint a = b;a += 3;b -= 4;a *= 5;a /= 2;a %= 3;flags &= new_flags;flags = new_flags;flags |= new_flags;flags = 2;right to left16 , Sequential evaluation operatorfor( i = 0, j = 0; i , +, -其中的自增(+)和自减()都是后缀运算符。2. 第二组的成员是剩下来所有的一元运算符,它们分别是:+, -, +, -, , !, *, &, (type), siz

8、eof其中的+于都是前缀运算符。另外这一组的运算符都是右结合的。3. 一元运算符之后就剩下二元运算符了,而二元运算符中优先级中最高的就是算术运算符这一类,所以第三组是:*, /, %4. 可以由第 3组推断得出第四组是: +, -5. 级别次于算术运算符的是位移运算符,所以这一组的成员是:6. 接下来这一类就是关系运算符了,第 6组的成员有:, =7. 虽然都是关系运算符,但是=, !=优先级要低一些,这样我没就可以写出诸如:a b这样的判别式。8. 次于关系运算符的是二元的位运算符,一共有三个,把它们分为三个组,这一组是:&9. 然后是10.最后是|11.接着就是逻辑运算符这一类了,只有两个

9、,分成两组,这组是:&12.然后|13.二元的运算符之后就好似三元运算符了,C 语言中只有一个:?:14.级别倒数第二高的是那些赋值运算符了,有很多:=, +=, -=, *=, /=, =, %=, &=,|=, =15.最后是优先级最低的运算符:,遍历了 15个级别之后,让我们再来总结一下。其中我们可以看出这样两个规律:规律一、按照操作数个数来区分,一元运算符高于二元运算符,二元运算符高于三元运算符;规律二、按照运算符的作用来区分,级别最高的是那些不是严格意义上的运算符,次之是算术运算符,位移运算符,关系运算符,位运算符,逻辑运算符,赋值运算符。此外还有两特别的地方需要注意:一、同为关系运

10、算符,但=和!=的级别低于其它四个;二、第 2组与第 13组的操作符是右结合的,其它的都为左结合;通过分类我们大大减少了需要记忆的内容,遇到使用操作符的时候,我们只需想想它们是什么类型的运算符就可以确定它们之间的相对优先级,从而避免一些不必要的错误。=提起运算符的优先级,很多了解 C+的过来人都会想:这有什么难的?不就是谁的优先级高就算谁么。确实如此,运算符的优先级不是一个大问题,但对于一个初学者来说,却经常容易在上面迷糊与犯错。而对于一个了解 C+的人来说,我相信也会偶尔在上面摔倒,不信就继续往下读。“优先级高的先运算”带来的困惑C+中运算符的优先级有一张表,表里把运算符进行了分类,这张表是

11、不需要死记硬背的,只要有个大致的轮廓就 OK了。例如应该记住最低优先级是逗号运算符,其次是赋值运算符,再其次是三目运算符。而关系运算符的优先级高于逻辑运算符(不包括逻辑非运算),算术运算符的优先级高于关系运算符,象+和的优先级比前面几个都高,但最高的要属()了。知道这些后,你的脑海里一定有一条准则了:优先级高的先运算。那么下面看一个例子:int x=1,y=0;!x&x+y&+y;上面的语句中出现了!、& 、+、+这四个运算符,那么问题来了,到底先算谁呢?有一个姓蔡的同学站起来说,+运算符在这里面优先级最高,理所应当最先算+,既先计算+y,再算!x,再算 x+y,最后把它们&起来。按照蔡同学的

12、思路,第二步的结果是0&x+y&1,由于&是严格运算,有一个为 0结果既为 0,所以不需要计算 x+y了,整个语句的结果是:假。按照上面蔡同学的说法,执行完后 y的值应该是 1了,这对不对呢?一位姓高的同学站起来反驳道,我觉得应该先计算!x,如果值为假,则不需要计算下去,最后结果为假。如果值为真,再计算 x+y,同理如果其值为真,再去计算+y,否则最后结果也为假。蔡同学不服起来说,高同学你觉得+和!谁的优先级高呢?高同学答道,那当然是+高。蔡同学接着问,那为什么还要先计算!呢?高同学答不出来了。是呀,为什么要先算!呢?加括号确定优先级的方法高同学说的是正确的,为什么呢?下面我给大家解释一下。当

13、多个优先级不同的运算符在一起时,为了不混淆,可以先加上括号,这样就分出层次了,相同层次的考虑结合性问题,当确定下来先算那块时,再往这块里面深入。例如上面的例子,我们可以这样加上括号:从左向右看,由于!比&优先级高,所以有(!x),又由于&比+优先级低,所以有(x+y),而+优先级高于&,所以(+y)。这样整个式子就变成了:(!x)&(x+y)&(+y),最外层的是两个&运算,由于&的结合性是从左至右,所以上式可看成:A&B&C,先计算 A,再计算B,最后算 C。由于 x=1,则!x 就为假,后面的就不需要再算了,整个语句的值为假。执行完后,y 的值没变,还是 0。所以碰到不清楚先算谁后算谁时,

14、先加个括号看看,就明白了先后次序。下面做一个加括号的练习:给语句 c=ab?a:b;加括号。此语句有三个运算符:=、? :,应该怎样加括号呢?第一种方案:c=(ab)?a:b);第二种方案:c=(a(b?a:b);第三种方案:(c=a)(b?a:b);应该是那一种呢?按照运算符优先级的高低顺序,优先级高于=,所以不可能把(c=a)括起来。而优先级高于? :运算符。所以也不可能把(b?a:b)括起来。因此,第一种答案正确。下面再看一个类似的例子:int i=8,j=4,k;k=ij?+i:+j;猛然一看,有些人上来可能就要计算+i 和+j 了。这里不妨先加括号看看。从左至右看,的优先级高于=而且

15、又高于? :,所以有 k=(ij)?+i:+j,再继续向右看,由于+高于? :,所以 k=(ij)?(+i):(+j),这样相当于 k=A?B:C,先算 A的值,若为真,则值为 B,即算一下+i,若为假,则值为 C,即算一下+j。整个语句执行完后,k 的值为 5,i 的值为8,j 的值为 5。 =每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式 a*b+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法 a*b,而不是加法 b+c。但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式:int a,b=1,c=2;a=b=c;我们发现,这个表达式只有赋值符,这样优秀级就无法帮助我们决定哪个操作先执行,是先执行 b=c呢?还是先执行 a=b。如果按前者,a=结果为 2,如果按后者,a 的结果为 1。所以的赋值符(包括复合赋值)都具有右结合性,就是说在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c 先赋值

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号