免费注册 查看新帖 |

Chinaunix

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

抽人欢乐多 [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
41 [报告]
发表于 2012-05-28 23:43 |只看该作者
回复 36# wwwsq


    ………………

我觉得你的逻辑能力……额,我不人身攻击……

好吧,我继续说,这里存在一个对标准最基本的理解问题。什么是值?某种类型的某种状态被称为值(我的理解)。即1是一个int值,2也是。这里表达的意思仅仅是,如果a具有什么值,让这个表达式有**同样的**值就可以了。这个值并不一定非要是a本身(你也知道,编译以后也未必有a本身这种东西了)。比如b是float 2.0,那么这个表达式的值“恰好”就是int 2,它“恰好”和赋值以后的a的值相等。但是这并不意味着必须要给a赋值以后,编译器才知道这个值是什么——毕竟,如果不知道这个值是什么,编译器如何给a赋值呢?最终的结果是,编译器手上有三件事情做:

1. 计算出要给a赋的值到底是什么(用b和a、b的类型去算)。
2. 把赋值的结果作为整个表达式的值,参与外界的运算。
3. 把赋值的结果真正地存到a里面去。

2和3的顺序(在整个顺序点范围内)都是任意的。编译器什么时候计算出了要赋给a的值到底是什么以后,可以在任意时刻做这种保存工作,而不是立即、在所有其他操作进行前、做这个操作。这就是标准这段话的全部含义。

而a = b, a > 0不同。逗号运算符会提供一个序列点,那么这个赋值操作就必须在比较之前进行,否则就是不符合标准。

论坛徽章:
0
42 [报告]
发表于 2012-05-28 23:46 |只看该作者
KBTiller 发表于 2012-05-28 23:40
约束实现是标准的用途之一


约束之后,唯一正确的实现就是把r1指向a。

这就是我为什么说老谭的解释并没有错。r1指向的就是a,而r1只是理论上存在的东西。

论坛徽章:
0
43 [报告]
发表于 2012-05-28 23:48 |只看该作者
starwing83 发表于 2012-05-28 23:43
回复 36# wwwsq



a=1
b=-1
if ((a=b)>0)

你认为比较会在赋值之前还是之后做?

考虑到“An assignment expression has the value of the left operand after the assignment

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
44 [报告]
发表于 2012-05-28 23:48 |只看该作者
回复 42# wwwsq


    不要忽略我的存在好不?我已经指出了满足这种约束的好几种顺序了……

论坛徽章:
0
45 [报告]
发表于 2012-05-28 23:48 |只看该作者
wwwsq 发表于 2012-05-28 23:40
An assignment expression has the value of the left operand after the assignment



表达式的值必须而且只能是left operand,你不能理解这句话吗?这实际上是在说,所谓表达式的值,其实是指向a变量的寄存器的。


我英文不够好
但我理解那说的是the value of the left operand
而不是left operand

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
46 [报告]
发表于 2012-05-28 23:49 |只看该作者
回复 43# wwwsq


    即使是考虑到这句话,也可能在比较之后做。我41楼说的真的很明白了……来个懂标准的评评理吧……

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
47 [报告]
发表于 2012-05-28 23:50 |只看该作者
回复 45# KBTiller


    kb,我41楼完全是一样的意思,我觉得我说的已经很明白了,还是这个样子,这……怎么办?

论坛徽章:
0
48 [报告]
发表于 2012-05-28 23:50 |只看该作者
starwing83 发表于 2012-05-28 23:48
回复 42# wwwsq



2. 把赋值的结果作为整个表达式的值,参与外界的运算。
3. 把赋值的结果真正地存到a里面去。

2 和 3的顺序显然是不能颠倒的。

否则就不符合“An assignment expression has the value of the left operand after the assignment

a=1
b=-1
if ((a=b)>0)

上面这个表达式也会出现二义性。

论坛徽章:
0
49 [报告]
发表于 2012-05-28 23:50 |只看该作者
wwwsq 发表于 2012-05-28 23:46
约束之后,唯一正确的实现就是把r1指向a。

这就是我为什么说老谭的解释并没有错。r1指向的就是a,而 ...

标准并没有要求如何实现
编译器爱怎么实现就怎么实现
不存在所谓“唯一正确的实现”

论坛徽章:
0
50 [报告]
发表于 2012-05-28 23:51 |只看该作者
本帖最后由 wwwsq 于 2012-05-28 23:51 编辑
KBTiller 发表于 2012-05-28 23:48
我英文不够好
但我理解那说的是the value of the left operand
而不是left operand



在实现层面如何保证“has the value of the left operand”?实际上只有一个办法,那就是reference,或者指针指向,或者寄存器引用。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP