加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2011-09-20 15:30:32)
标签:

c语言

答疑

教育

分类: 作业及答疑

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


问题:对于表达式  --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求值并作为表达式的值,并且bc中有且仅有一个会被求值。对于题目中的就应该是:先进行(--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

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有