免费注册 查看新帖 |

Chinaunix

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

抽人欢乐多 [复制链接]

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


算了,我问你一句,我上面那个代码,你用msc能不能编译过,能还是不能?

论坛徽章:
0
22 [报告]
发表于 2012-05-28 23:09 |只看该作者
本帖最后由 wwwsq 于 2012-05-28 23:10 编辑
walleeee 发表于 2012-05-28 23:04
回复 19# wwwsq



老谭的那个描述有没有错误?我认为没有错误,你认为错误在哪里?

某个寄存器,你可以说是a的值,也可以说是(a=b)这个表达式的值。所谓(a=b)这个表达式,我倾向于认为表达式是没有值的。变量才是对那些“寄存器、内存地址数据”,的比较好的指代。

论坛徽章:
0
23 [报告]
发表于 2012-05-28 23:10 |只看该作者
回复 19# 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
24 [报告]
发表于 2012-05-28 23:10 |只看该作者
本帖最后由 starwing83 于 2012-05-28 23:19 编辑

回复 2# wwwsq


    咳咳,刚刚给女朋友打电话……

这个pm说的非常正确,你抽了这个只能证明你对标准十分不了解………………

首先请谷歌或者百度一下《顺序点》的概念(sequence point),

两个顺序点之间的副作用应用顺序是可以出现在任意时刻的。

注意括号指定的是运算符对操作数的选取,而不是运算具体的执行顺序。

(a = b) > 0

只是代表 b和a一样,是属于赋值运算的操作数,而这个操作的结果是>运算的操作数,仅此而已,对这些运算何时进行,没有做任何限制。

理论上来说赋值出现在if判断条件内的任何时刻都是允许的。

比如说,一个C编译器完全可以以下面的任意方式去编译这个表达式:

假设:

1. b -> r1
2. r1b -> a
3. r1 > 0 ?

123,213,132等等的任何顺序都是符合标准的。


所以,这个论题,pm完全正确,老谭是严重的概念错误。完毕。

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


跟你说话真费劲。我给你回顾一下:

你说对c(c99吧)语言a=b返回的是a的引用,我很惊讶,就给你举了个例子代码,然后你说我转牛角尖并让我说怎么表述比较好,于是我给你了一个扭曲的表述,然后你没踩我,接下来你拿出了msc++对=的说法,好吧,这里我就当你又切换战场到c++了(注意,本来一直在说c),然后我叫你用msc看能不能编译我那个代码,你就说我不知所云。老子问你的问题,你一个接一个忽视,你真有意思,居然说我不知所云,擦,你太牛了。

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


你是不是要死磕?

先进行赋值运算(将b的值赋给a),然后判断a是否大于0
从赋值操作符的语义来说,返回的就是对a的引用。


这些是不是你说的。当屁话了么?

论坛徽章:
0
27 [报告]
发表于 2012-05-28 23:18 |只看该作者
wwwsq 发表于 2012-05-28 23:09
老谭的那个描述有没有错误?我认为没有错误,你认为错误在哪里?

某个寄存器,你可以说是a的值,也可以说是(a=b)这个表达式的值。所谓(a=b)这个表达式,我倾向于认为表达式是没有值的。变量才是对那些“寄存器、内存地址数据”,的比较好的指代。

谈到寄存器就彻底超出语言层面了
至于你“认为表达式是没有值的”
我认为已经大胆地颠覆了所有版本的C语言的定义

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



问题是r1那个寄存器代表什么,怎么称呼。r1应该被称为是(a=b)这个表达式的值,还是应该被称为是a的值?

关键是b->r1是必须先于r1>0?的。那么r1该被称为什么呢?

我认为变量才是更好的“寄存器、或者内存数据”的指代。

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


这个只是个人观点。在高级语言和汇编之间,由于符号的差异,是有一些模糊不清的地带的。

高级语言有很多符号来做指代,而汇编没有了那些符号。那么汇编和符号之间怎么映射?对于r1那个例子,r1被称为什么比较好?

论坛徽章:
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
30 [报告]
发表于 2012-05-28 23:26 |只看该作者
本帖最后由 starwing83 于 2012-05-28 23:28 编辑

回复 19# wwwsq


   
An assignment operator stores a value in the object designated by the left operand. An
assignment expression has the value of the left operand after the assignment, but is not an
lvalue.  The type of an assignment expression is the type of the left operand unless the
left operand has qualified type, in which case it is the unqualified version of the type of
the left operand. The side effect of updating the stored value of the left operand shall
occur between the previous and the next sequence point


摘自ISO C。

注意,我标红了这段话的第一个after,注意你的MSDN里面也是有个after的。after如何理解?是说的时间?非也。注意最后一段加粗的话。如果after指的是时间,那么这段话明显和after矛盾了。那么after指的是什么呢?是赋值运算结果(是的,标准规定赋值运算是有返回结果的!)的类型和值等等。即你可以当作那个值是赋值后的左操作数的值,这时赋值其实可以还没完成。比如说,我先算值,然后返回这个值进行某些操作(比如比较),最后再进行实际的保存。

对于操作的类型,下面这段代码:

int a;
float b = 1;
printf("%s\n", typeof((a = b)));

(假设有typeof函数的话)的结果应该是int,而不是float。仅此而已。而且后面对这个类型也值了更严格的限制:如果右操作数是非限定版本,则类型应该是非限定版本(去掉了const、volatile等等以后的版本)。这么说你理解了?

抓错没事儿,把对的抓成错的就贻笑大方了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP