免费注册 查看新帖 |

Chinaunix

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

一段关于运算符和结合性奇怪的程序(高人请教) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-12-26 19:55 |只看该作者
本帖最后由 KBTiller 于 2010-12-26 21:07 编辑

回复 10# venkee


    我同样可以说
   
  1. C=D=C++;
复制代码

    明显是在两个序点之间改变C的值两次,因此是错误的或没有意义的代码

论坛徽章:
0
12 [报告]
发表于 2010-12-26 21:11 |只看该作者
回复 1# venkee


    我觉得还是多从问题出发,从表达思想着手为好

论坛徽章:
0
13 [报告]
发表于 2010-12-26 21:42 |只看该作者
回复 11# KBTiller


    但它是有顺序地改变,并不是像你所说的那样存在二义性,而且我肯定地说,赋值那段代码在所有架构的处理器上都会得出同样的结果

论坛徽章:
0
14 [报告]
发表于 2010-12-26 21:51 |只看该作者
回复  KBTiller


    但它是有顺序地改变,并不是像你所说的那样存在二义性,而且我肯定地说,赋值那段 ...
venkee 发表于 2010-12-26 21:42



那请教下venkee为什么C和D的值为什么不一样?
因为D=C++这个表达式的返回值是自增后的C?

论坛徽章:
0
15 [报告]
发表于 2010-12-26 22:51 |只看该作者
回复  KBTiller


    但它是有顺序地改变,并不是像你所说的那样存在二义性,而且我肯定地说,赋值那段 ...
venkee 发表于 2010-12-26 21:42

理由或根据呢?
C语言从来没说过它是有顺序地改变
二义性不是我说的,是C标准说的
(看来那段你还没读懂)

论坛徽章:
0
16 [报告]
发表于 2010-12-26 23:00 |只看该作者
这种问题找标准吧
标准说未定义就启动个游戏吧

论坛徽章:
0
17 [报告]
发表于 2010-12-27 00:00 |只看该作者
理由或根据呢?
C语言从来没说过它是有顺序地改变
二义性不是我说的,是C标准说的
(看来那段你还没读 ...
KBTiller 发表于 2010-12-26 22:51



再仔细想想了,对于这个表达式
C=D=C++;
存在的问题似乎又明朗了点。

执行完 D=C++后,对C产生的side effect可能还没有写回到变量C中,有可能在表达式C=D=C++对C赋完值后,产生的side effect才再写回C中。

不知道是不是这样理解?

论坛徽章:
0
18 [报告]
发表于 2010-12-27 07:10 |只看该作者
回复 17# Magic_LP

我也是这样理解的
核心在于那个“++”的side effect发生的时间C语言是没有规定的(只要在下一个序点前完成就可以)
楼主似乎没有意识到这一点

论坛徽章:
0
19 [报告]
发表于 2010-12-27 16:20 |只看该作者
回复 18# KBTiller


    其实那一段赋值,我也是按这样子的思路来理解的,但刚开始会错了你的意,而且没看清楚狂人C的描述,很抱歉

论坛徽章:
0
20 [报告]
发表于 2010-12-27 17:41 |只看该作者
回复  KBTiller


    判断那里确实是这样,但赋值那里就不是你所说的那样了,你不能说赋值那段操作具有 ...
venkee 发表于 2010-12-26 19:38



    赋值是未定义的。 同一个sequence point之间改变同一个对象值多次是为定义的行为
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP