c语言的左结合性与右结合性

右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行 
左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行 
在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。 
每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式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先赋值给b,然后b在赋值给a,最终a的值是2。类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。 
结合性只用于表达式中出现两个以上相同优先级的操作符的情况,用于消除歧义。事实上你会注意到所有优先级相同的操作符,它们的结合性也相同。这是必须如此的,否则结合性依然无法消除歧义,如果在计算表达式的值时需要考虑结合性,那么最好把这个表达式一分为二或者使用括号。 
例: 
a=b+c+d 
=是右结合的,所以先计算(b+c+d),然后再赋值给a 
+是左结合的,所以先计算(b+c),然后再计算(b+c)+d 
C语言中具有右结合性的运算符包括所有单目运算符以及赋值运算符(=)和条件运算符。其它都是左结合性。 
在C语言中有少数运算符在C语言标准中是有规定表达式求值的顺序的: 
1:&& 和 || 规定从左到右求值,并且在能确定整个表达式的值的时候就会停止,也就是常说的短路。 
2:条件表达式的求值顺序是这样规定的: 
test ? exp1 : exp2; 
条件测试部分test非零,表达式exp1被求值,否则表达式exp2被求值,并且保证exp1和exp2两者之中只有一个被求值。 
3:逗号运算符的求值顺序是从左到右顺序求值,并且整个表达式的值等于最后一个表达式的值,注意逗号’,’还可以作为函数参数的分隔符,变量定义的分隔符等,这时候表达式的求值顺序是没有规定的! 
判断表达式计算顺序时,先按优先级高的先计算,优先级低的后计算,当优先级相同时再按结合性,或从左至右顺序计算,或从右至左顺序计算。

优先级关系:

括号成员第一;                //括号运算符[]() 成员运算符. ->

全体单目第二;              //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&
乘除余三,加减四;         //这个"余"是指取余运算即%

移位五,关系六;          //移位运算符:<< >> ,关系:> < >= <= 等

等于(与)不等排第七;      //即== 和!=

位与异或和位或;   "三分天下"八九十;     //这几个都是位运算: 位与(&)异或(^)位或(|) 

逻辑或跟与;              //逻辑运算符:|| 和 &&

十二和十一;           //注意顺序:优先级(||) 底于 优先级(&&) 

条件高于赋值,                //三目运算符优先级排到13 位只比赋值运算符和","高

逗号运算级最低!        //逗号运算符优先级最低 
 

转自:http://tieba.baidu.com/p/3781601455

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值