免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1478 | 回复: 6
打印 上一主题 下一主题

请教一个关于?:结合性的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-14 13:54 |只看该作者 |倒序浏览
ANSI C中规定了?:的结合性为从从右向左
对于像a ? b ? c : d : e;
实际在VC6.0 和 GCC2.96下都是先判断a 然后再在b?c:d 和e 中选择一个
请教各位 有没有一个具体的例子来证明?:操作的结合性?

论坛徽章:
0
2 [报告]
发表于 2005-06-14 15:21 |只看该作者

请教一个关于?:结合性的问题

关注!
所谓的结合性,是不是有运算符和操作数之分啊?
望大侠指点!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2005-06-14 15:39 |只看该作者

请教一个关于?:结合性的问题

还是有括号比较好.写出的程序直观容易懂.

论坛徽章:
0
4 [报告]
发表于 2005-06-14 17:11 |只看该作者

请教一个关于?:结合性的问题

回楼上的 不是写不写括号的原因
我能想到的两个?:操作符连接的情况只有上面这种嵌套的
而这种情况实际上是按a?b:c操作数的先后顺序来决定执行顺序的
既先a 然后根据情况决定b和c
我实在想不出其他两个?:操作符连接的情况 如果不存在其它连接情况那么定义?:的连接性又有什么意义呢?本来?:就是独占一个优先级的
请大家帮忙想想  我自己有点迷糊

论坛徽章:
0
5 [报告]
发表于 2005-06-14 17:35 |只看该作者

请教一个关于?:结合性的问题

原帖由 "javacool" 发表:
ANSI C中规定了?:的结合性为从从右向左
对于像a ? b ? c : d : e;
实际在VC6.0 和 GCC2.96下都是先判断a 然后再在b?c:d 和e 中选择一个
请教各位 有没有一个具体的例子来证明?:操作的结合性?



因为右结合,所以先找e前的第一个":",并寻找与之匹配的"?"。
自右至左找到第一"?",如果这样组合:

  1. (a?b)?(c:d):(e);
复制代码

则表达式无法理解,所以理解成这样:

  1. (a)?(b?c:d):(e);
复制代码


如i+++j这样的表达式,编译时自左至右尽可能多的将若干个字符组成一个运算符。所以i+++j相当于(i++)+j。
但我不知道在上面的条件表达式中编译时是如何控制的?

至于右结合的意义,我理解为:
如果是左结合,那么内嵌的(b?c:d)必将执行;如果右结合,那么(b?c:d)是否执行取决于表达a的求值结果。

论坛徽章:
0
6 [报告]
发表于 2005-06-15 10:08 |只看该作者

请教一个关于?:结合性的问题

我理解结合性是这样的:
左/右结合并非表示从左到右(或反之)扫描一个表达式,并按扫描顺序顺求值。

当优先级相同时,结合性起作用的情况是一个操作数相邻两个运算符时,结合性将决定该操作数与左(或右)边的运算符结合并运算。

如:

  1. a+b-c;
  2. b相邻+和-两个运算符,由于加减运算是左结合,所以上述表达式相当于(a+b)-c;
复制代码

但:

  1. a*b+c*d-e*f;

  2. 并不能保证加法先于减法运算,因为没有一个操作数相邻两个同级运算符的情况。此时加减顺序取决于编译器,包括三个乘法那个先求值也取决于编译器。

  3. 甚至可能是这样的顺序:
  4. (a*b+c*d)-e*f;
  5. 也就是第一个加法先于后面的e*f乘法运算。
复制代码


当结果取决于编译器实现时,这样的代码不具移植性,应尽量避免。
不知我的理解可对,请大家指点!:)

论坛徽章:
0
7 [报告]
发表于 2005-06-16 09:43 |只看该作者

请教一个关于?:结合性的问题

大家有什么看法?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP