三目运算符的右结合性分析

三目运算符的右结合性分析

转自:http://blog.sina.com.cn/s/blog_6b7c77e00100ucqq.html


        问题:对于表达式  --a == b++ ? a++ : b++
       当然是先判断--a 是否等于 b++ ,然后决定执行后面的哪个表达式。但是它的又结合性体现在哪里呢??

       回答:这里涉及了C语言中的优先级、结合性、求值顺序。

       结合性只有在相同优先级的运算符间才起作用,比如a+b*c,+与*优先级不同,这里根本不用去管结合性。而a+b+c则需要进行结合性考虑了,如果+为左结合性,那么应该理解为:(a+b)+c,如果+为右结合性,那么应该理解为a+(b+c),当然了,我们已经知道+为左结合性了。

       对于?:,在C中与它优先级相同的只有它自己,因此只有连续的?:才会体现出它的右结合性,即a?b:c?d:e中,根据右结合性可知应理解为a?b:(c?d:e)。显然,上述问题中是体现不出这种结合性来的。

       再者,还有一个求值顺序的问题,a?b:c中,C语言规定先对a求值,非零则对b求值并作为该表达式的值,为零则对c求值并作为表达式的值,并且b和c中有且仅有一个会被求值。对于题目中的就应该是:先进行(--a == b++)的求值,根据是否为零,会对(a++)或(b++)进行求值。说白了,也就是只有两种可能性:可能性1:先算(--a == b++),再算(a++);可能性2:先算(--a == b++),再算(b++)。

       总结一下: 就是先看优先级,次看结合性。

实例1:
       #include<stdio.h>
       void main()
       {
             int a=1, b=1;
             --a == b++ ? a++ : b++;
             printf("a=%d, b=%d\n", a, b);
       }

结果:
       a=0, b=3

实例2:
       #include<stdio.h>
       void main()
       {
             int a=1, b=0;
             --a == b++ ? a++ : b++;
             printf("a=%d, b=%d\n", a, b);
       }
       
结果:
       a=1, b=1
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值