C语言运算符优先级及结合性

今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧。发现一篇讲得不错的文章,编辑了下转来供以后翻阅。

 

C语言运算符优先级表(由上至下,优先级依次递减)

 

运算符

结合性

() [] -> .

自左向右

! ~ ++ -- - (type) * & sizeof

自右向左

* / %

自左向右

+ -

自左向右

<< >>

自左向右

< <= > >=

自左向右

== !=

自左向右

&

自左向右

^

自左向右

|

自左向右

&&

自左向右

||

自左向右

?:

自右向左

Assignments

自右向左

,

自左向右

 

1、() [] -> .之类的理所当然是最优先的,其实它们压根也不算什么运算符了。


2、除了上面的四种运算符之外,接下来就是单目运算符,也就是! ~ ++ -- - (type) * & sizeof 了。记住它们的顺序可是自右向左啊!其实结合实例是很容易理解的,比如i++等。


3、接着是双目运算符了,也是C语言运算符优先级中最容易让人混淆的地方了。其实也没有那么可怕,你认真观察就会发现。在双目运算符中,算术运算符优先级最高,然后是移位运算符,接着是关系运算符,再着是逻辑运算符。不过这边需要说的是,在关系运算符中,< <= > >=== !=的优先级来得高。此外,在逻辑运算符中,与运算又比或运算优先级来得高,异或则处于二者之间。同样的,你可以类比出&&||的优先级关系


4、在双目操作符之后,就是三目操作符了,没有什么好说的了。


5、然后是赋值操作符,你也许会把赋值操作符与三目运算符的优先级搞混。没有关系,我想你一定写过这样的语句(如果没有,请你记住!):max = (a>b)?a:b; ,从这个语句里,你就不难记住赋值运算符为什么比三目运算符的优先级低了!


6、逗号运算符是分割各个子语句的(感觉这么说有点不准确,不过我想大家会明白我的意思的),自然优先级最低了,我想这个应该不是很容易混淆的。


总结一下,按运算符优先级从高到低:单目运算符->双目运算符->三目运算符->赋值运算符->逗号运算符 特别在双目运算符中,按 运算符优先级从高到低:算术运算符->移位运算符->关系运算符(其中==  !=优先级又较低)->逻辑运算符(按位与-〉按位异或-〉按位或-〉逻辑与-〉逻辑或)!

 

  

      运算符的结合性指同一优先级的运算符在表达式中操作的组织方向当一个运算对象两侧运算符的优先级别相同时运算对象与运算符的结合顺序, C 语言规定了各种运算符的结合方向结合性。大多数运算符结合方向是自左至右”, 先左后右例如a- b+c, b 两侧有+两种运算符的优先级相同按先左后右结合方向, b 先与减号结合执行a- b 的运算再执行加的运算。除了自左至右的结合性外, C 语言有三类运算符参与运算的结合方向是从右至左。即单目运算符条件运算符以及赋值运算符。关于结合性的概念在其他高级语言中是没有的这是C语言的特点之一。


    ++a 
a++--a a--分别称为前置加或后置加运算和前置减或后置减运算,都是单目运算符。值得注意的是前置、后置运算只能用于变量不能用于常量和表达式且结合方向是从右至左。如当i=6 - i++的值和的值。由于“- ”(负号) “++”为同一个优先级故应理解为- (i++),又因是后置加所以先有-i++的值为-6, 然后增值7, i=7


1 main()
{

int a=3,b=5,c;
c=a*b+++b;
printf ( “c=%d”, c);

}


要得出的值首先要搞清+++的含义。++运算符的结合方向是自右向左的如果将表达式理解为:c=a*b+(++b);实际上编译器将表达式处理为:c=(a*b++)+b, 因为编译器总是从左至右尽可能多地将若干个字符组成一个运算
i+++j 等价于(i++)+j。接下来是解决a*b++的问题因为++运算符的运算对象只能是整型变量而不能是表达式或常数所以a*b++显然是a*(b++)而非(a*b)++, 因此整个表达式就是c=(a*(b++))+b,结果为c=20


2 main()
{

int i=1,j;
j=i+++i+++i++;
printf( “i=%d,j=%d/n”, i,j);

}


3 main()
{

int i=1,m;
m=(++i)+(++i)+(++i);

printf( “i=%d,m=%d/n”, i,m);

}


的值均由表达式求得并且这两个表达式均由自增运算符、加法运算符和赋值运算符组成。那么它们的值到底为多少呢? j=1+1+1=3 还是j=1+2+3=6? m=2+3+4=9 还是m=4+4+4=12?上机运行结果为: i=4,j=3,m=10(VC6.0)。分析运算符“++”,“+”“=”的优先级是递减的在计算时,先进行自增运算再进行加法运算最后是赋值运算。而自增运算又根据“i++”“++i”的不同定义得到不同的值。i+++i+++i++先将原值(1)取出作为表达式中i的值进行加法运算得到3, 然后再实现三次自加; (++i)+(++i)+(++i)的计算与编译器有关。


a=6, 求赋值表达式a+=a-=a-a*a 的值。
由于“*”(乘号)“- ”(减号)优先级高于“+=”“- =”, “*”优先级高于“- ”, 故先求a- a*a, 6- 6*6=- 30, “+=”,“-=”为同一优先级且是从右至左的结合方向再求a- =- 30,a=a- (- 30)=6+30=36, 最后求a+=36, a=a+36=36+36=72, 所以赋值表达式的值为a=72


m=1,n=2,b=3, 求赋值表达式m+=n-=---b 的值。
这里共有四个运算符“+=”“-=”“-”(负号)“--”, 由运算符优先级应先计算---b, “--”“-”(负号)优先级相同如按从右到左的结合方向它可能是-(--b), 也可能是--(-b), 究竟是哪一个呢?前面已讲过前置运算只能用于变量不能用于表达式(-b)不是一个变量而是表达式故只能是-(--b), 即为-(3-1)=-2; 然后计算n-=-2, n=n-(-2)=2-(-2)=4; 最后计算m+=4, m=m+4=1+4=5, 所以赋值表达式的值m=5


    
当看到一个复杂的C语言表达式时首先应按优先级进行运算然后在同一优先级中按结合方向进行运算。

 

转自http://blog.chinaunix.net/u1/54388/showart_1668929.html

 

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值