免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2010-12-27 17:45 |只看该作者
再仔细想想了,对于这个表达式
C=D=C++;
存在的问题似乎又明朗了点。

执行完 D=C++后,对C产生的 ...
Magic_LP 发表于 2010-12-27 00:00


无论怎么样D=C++是确定的行为, “C++”这个的作用是C加1,但这个表达式本身的值是C,所以不管side effect什么时候发生,D一定是C。 不知有没有说清楚。

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


    其实那一段赋值,我也是按这样子的思路来理解的,但刚开始会错了你的意,而且没看 ...
venkee 发表于 2010-12-27 16:20



    您客气了。也可能我没说清楚

论坛徽章:
0
23 [报告]
发表于 2010-12-27 20:28 |只看该作者
您客气了。也可能我没说清楚
KBTiller 发表于 2010-12-27 19:36



对,D的值是确定的,就是C的值。

我一开始存疑的地方是整个表达式的前半部分,对C赋值的那段,是C的原值还是自增1后的值?按照C狂人的看法,这个是不确定的。

我觉得这个问题可以简化为:
C=C++;
这个表达式是不是不符合标准的?
标准没有保证这个表达式结束后C的值,它可能是C,也可能是C+1。

但是如果换成这样
C=++C;
是不是就可以保证C的值就一定是C+1?

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


经过你的提醒,我确实对这个问题有了更深的认识:
(1)先说优先级问题:优先级并不定义各运算符所做的运算操作次序,而是定义在涉及需要通过同一对象计算操作数时,哪些操作符需要的操作数优先得到计算。(应该是这样吧)
     C++语言只规定了&&,||和?:操作符的操作数计算次序,其他操作符则没有规定。
(2)先说++C==C++这个判断操作,依据操作符优先级,==这个操作所需的操作数都得让位于前++和后++操作符对其操作数的计算,但是是先通过++C获得操作数还是先通过C++获得操作数,C语言没有规定。这里可能我们大多数的编译器应该都选择了先通过++C操作后获取操作数,亦即是1,所以再等待C++返回1时,两个值刚好相等。
(3)再说C=C++这类赋值操作,=需要获取两个操作数,一个是通过直接读取C,一个是通过C++后获得,但是是先通过读取C值获得还是先通过C++操作好获得,C语言没有定义,如果编译器选择前者,则第一个C值读入,计算C++并返回原值,并对第一个C赋值,最后完成C+1效应,C还是增加了1。
虽然不能理所当然认为每步都是按操作符先后出现进行运算,但我总怀疑是不是优先级高的运算符总是因为需要为前面出现的运算符返回操作数而优先得到执行运算操作?
这是小弟经过再三思考的拙见。不知道对不对。

论坛徽章:
0
25 [报告]
发表于 2010-12-27 22:41 |只看该作者
回复 23# Magic_LP

    按照标准
    C=C++;
    C=++C;
    都属于未定义行为

论坛徽章:
0
26 [报告]
发表于 2010-12-27 22:43 |只看该作者
本帖最后由 KBTiller 于 2010-12-27 22:44 编辑
回复  KBTiller

(1)先说优先级问题:优先级并不定义各运算符所做的运算操作次序,而是定义在涉及需要通过同一对象计算操作数时,哪些操作符需要的操作数优先得到计算。(应该是这样吧)
C++语言只规定了&&,||和?:操作符的操作数计算次序,其他操作符则没有规定。
venkee 发表于 2010-12-27 20:55


我更喜欢这样说
在一个表达式中是运算符选择操作数,而不是操作数选择运算符

此外逗号运算规定了次序

论坛徽章:
0
27 [报告]
发表于 2010-12-27 22:47 |只看该作者
无论怎么样D=C++是确定的行为, “C++”这个的作用是C加1,但这个表达式本身的值是C,所以不管side eff ...
donotblock 发表于 2010-12-27 17:45


在一个序列点内,对C赋值两次,是未定义行为,一旦出现未定义行为,一切都是未定义的,不会出现其中的一部分是确定行为的。

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

(2)先说++C==C++这个判断操作,依据操作符优先级,==这个操作所需的操作数都得让位于前++和后++操作符对其操作数的计算,但是是先通过++C获得操作数还是先通过C++获得操作数,C语言没有规定。这里可能我们大多数的编译器应该都选择了先通过++C操作后获取操作数,亦即是1,所以再等待C++返回1时,两个值刚好相等。
venkee 发表于 2010-12-27 20:55

对于
++C==C++
来说
根据优先级其含义是
(++C)==(C++)
这并不是在说谁先算
只是在说谁是谁的运算对象而已
优先级和计算先后不是一回事情

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

(3)再说C=C++这类赋值操作,=需要获取两个操作数,一个是通过直接读取C,一个是通过C++后获得,但是是先通过读取C值获得还是先通过C++操作好获得,C语言没有定义,如果编译器选择前者,则第一个C值读入,计算C++并返回原值,并对第一个C赋值,最后完成C+1效应,C还是增加了1。
venkee 发表于 2010-12-27 20:55


C=C++
在我看来无非是(根据优先级)
C=(C++)
也就是把C++的值赋给C
C++的值无非就是C(求得这个值之后产生副效应,但不知道副效应产生的具体时间,只知道是在下个序点前)
可见优先级和运算顺序没有必然的关系
即使优先级高,其副效应也可能以后发生

当然这个表达式中C对象改变了两次,这是被禁止的

论坛徽章:
0
30 [报告]
发表于 2010-12-27 23:12 |只看该作者
回复 28# KBTiller


    如果KBTILLER您能把类似的这么一段代码用反汇编的方式呈现出来,那就好了,不知道行不行?因为小弟刚学习了汇编课程,所以能够用教程标准的格式写出来会更好
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP