免费注册 查看新帖 |

Chinaunix

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

抽人欢乐多 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2012-05-28 23:27 |只看该作者
KBTiller 发表于 2012-05-28 23:18
谈到寄存器就彻底超出语言层面了
至于你“认为表达式是没有值的”
我认为已经大胆地颠覆了所有版本的C语 ...



我的理解是表达式本身没有值,表达式只有运算返回值。

论坛徽章:
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
32 [报告]
发表于 2012-05-28 23:31 |只看该作者
回复 31# wwwsq


    表达式运算返回的值就是表达式的值……注意我转给你的标准摘抄,the ... expression has the value ...

论坛徽章:
0
33 [报告]
发表于 2012-05-28 23:35 |只看该作者
本帖最后由 wwwsq 于 2012-05-28 23:36 编辑
starwing83 发表于 2012-05-28 23:26
回复 19# wwwsq


An assignment expression has the value of the left operand after the assignment

在赋值之后,表达式的值是左边那个运算对象。

对于(a=b)来说,表达式的值就是左边那个运算对象a的值。

为什么这里要说a的值,而不说b的值呢,b的值是等于a的值呀?因为在实现层面,根本就没有“表达式的值”这么一个东西,从头到尾只有一个寄存器被赋值了,就是代表a的那个寄存器。这个寄存器即代表a的值,也代表(a=b)这个表达式的值。




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

short  s[2];

s 就是一个表达式
有值
但这里没有什么运算


   

论坛徽章:
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
35 [报告]
发表于 2012-05-28 23:36 |只看该作者
回复 28# wwwsq


    r1是a=b的值,同时也是a的值。标准规定赋值运算的值就是左操作符在赋值之后可能具有的值。(我这里用了可能,并不是标准的原话,见上面的帖子,这里只是说明要取得这个值未必是要赋值)

我举个例子,假设a是int,b是float,对于
(a = b) > 0

a = b的值是什么呢?是b的值?不对,这个值的类型是int而b的类型是float。是a的值?那是a什么时候的值呢?是a赋值以后的值。但是在这个表达式有值的时候,赋值操作可能根本就没来得及执行,标准允许这个实际的int 存储可以发生在两个顺序点之间的任意时刻,比如一个编译器可以这么做:

1. b转成int,存到r1
2. r1 是不是大于0?
3. 把r1给a
4. 把第二步的值返回。

如果编译器认为这么做可以获得更短的指令长度神马的,他有权利这么做,C标准允许这么做,然而如果按照你的理解,编译器就没有权利这么做了。就这么简单。

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



规定里面说,r1必须是a的值。这就约束了实现。

论坛徽章:
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
37 [报告]
发表于 2012-05-28 23:38 |只看该作者
回复 33# wwwsq


    …………你的臆想能力太丰富了。

见我上面的解释。这里有类型问题的。不是说赋值了两者的值就会相等的。

论坛徽章:
0
38 [报告]
发表于 2012-05-28 23:38 |只看该作者
wwwsq 发表于 2012-05-28 23:24
这个只是个人观点。在高级语言和汇编之间,由于符号的差异,是有一些模糊不清的地带的。

高级语言有 ...

高级语言和汇编有各自的语境
并行的

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



An assignment expression has the value of the left operand after the assignment



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

论坛徽章:
0
40 [报告]
发表于 2012-05-28 23:40 |只看该作者
wwwsq 发表于 2012-05-28 23:37
规定里面说,r1必须是a的值。这就约束了实现。


约束实现是标准的用途之一
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP