免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: donotblock
打印 上一主题 下一主题

[C] 优先级,结合性,序列点, 你理解清楚了么? [复制链接]

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
1 [报告]
发表于 2010-12-29 18:11 |显示全部楼层
本帖最后由 zhaohongjian000 于 2010-12-29 18:19 编辑

1.  优先级和结合性是的唯一作用是决定哪些操作数是属于那些操作符。
2.  优先级和结合性不能表明那些表达式先求值那些后求值。
----------------------------------------------------------------------------

  感觉这两点不正确,比如 a * b + c,由于*优先级高于+,所以a * b先被计算(当然,这里也可以解释为 * 的优先级使得a和b成为*的操作数)。

  再看这个:*p++,显然两个操作符都是针对p的,但语义究竟是*(p++)还是(*p)++由结合性决定。关于结合性,《C专家编程》上是这么解释的:1.它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。2.结合性只用于表达式中出现两个以上相同优先级的操作符的情况,用于消除歧义。根据结合性,代码:
  1. a = b = c
复制代码
的行为也是良好定义的,这个时候结合性决定后一个 = 先计算。

  我觉得楼主在表明自己观点的时候最好附上依据,比如ISO C文档中的原文,否则难以让人信服。我英语不好,查ISO文档有点困难,但我觉得关于结合性这一点,《C专家编程》里讲的应该没有问题。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
2 [报告]
发表于 2010-12-29 20:25 |显示全部楼层
回复 6# donotblock


    in any order  conforming to the precedence rules

    这个的意思是“以任何遵守优先级规则的顺序”吧,同样的条目在ISO/IEC 9899:1999(E)(应该就是C99)里面是这样的:

The order in which subexpressions are evaluated and the order in which side effects
takeplace, except as specified for the function-call (), &&, ||, ?:,and comma
operators (6.5).


    即子表达式的计算顺序是未指定的。但由于优先级和结合性的规则,为了计算某个子表达式可能需要计算另一个表达式,比如a*b+c,为了计算(a*b)+c,必须先计算a*b,优先级规则限制了这一点。

    另外,我认为表达式求值和side effects的发生并不一定同时。标准中只保证某序列点之前的side effects在序列点处已经发生,但子表达式求值总归是有一定顺序的,可能某个表达式被求值了,但side effects并未发生。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
3 [报告]
发表于 2010-12-30 09:15 |显示全部楼层
回复 14# donotblock


    优先级与结和性的作用只是说a*b+c应该这样分组(a*b)+c, 而不是a * (b +c).  你说的那个隐式的计算顺序应该是操作符+的语义决定的,(a*b)是+的第一个操作数。而evaluation,我觉得翻译成求值还没有完全体现原词的意味,并不只是计算出一个值的意思,  本身就包括side effect。


    这样解释好像的确没什么问题,关于这一点应该是观察角度不一样。不过关于求值,我不同意你的观点。如果一个表达式求值的时候其side effect就发生了,一切就简单多了。side effects的发生时间只由序列点来保证,比如:
  1. int a = 2;
  2. int b = a++ + a++;
复制代码
两个a++的计算顺序是不确定的,但如果side effects在求值的时候就发生了,那么无论先求哪个结果都是5,而实际情况不是这样(gcc下不开优化结果是4)。而如果认为求值的时候side effects不一定发生就能很好的解释了:尽管某个a++求值了,但side effects可能并未发生,a的值并未改变,于是结果为4。
    至于那段引文,只是指明了那些“动作”被执行,并未说合适执行,否则也用不着序列点了。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
4 [报告]
发表于 2010-12-30 09:20 |显示全部楼层
求值无顺序,这点C标准已经说的很明确了。
例如a*b+c这个表达式,不一定先计算a*b,也许先计算c,c的值无 ...
davelv 发表于 2010-12-30 08:43



    我想说的不是a*b 和 c的值那个先计算,而是为了计算a*b + c的值,必须先计算a*b,这个逻辑上的顺序不可能有例外的。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
5 [报告]
发表于 2010-12-30 12:34 |显示全部楼层
回复 19# donotblock


    我想表达的就是可能先计算表达式的值,稍后再发生side effects,就是这个意思...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP