免费注册 查看新帖 |

Chinaunix

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

531,继续抽某昏昏 [复制链接]

论坛徽章:
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
191 [报告]
发表于 2012-09-26 17:52 |只看该作者
回复 189# 幻の上帝


    大部分都同意。说两点:


1. C/C++里面的variable(如果有的话),name是不能改变的。以C++而言,由ODR可知,如果一个name绑定了一个value_entity,那么也许name在另一个语境下能绑定另一个value_entity,但是反过来不成立,一个value_entity必须绑定一个name,除非不绑定name。如果认为引用只是一个名字(忽略掉引用作为一种独立类型本身需要具备value_entity这个特点的话),那么你说的话在C++里成立:value_entity即使在一个上下文下也可以有不同的name,因此name和value_entity可以分离,即即使name不同,表达的也是同一个变量(是这个含义吧?)只是名字不同,因此你才说variable和variable name是不相关的。

问题是,这个说法在C里面是不成立的。C是没有引用的,一个value_entity必定只有一个name,或者没有name,这是由当前上下文决定的,而且是不可更改的。因此,在C里面,是很严格的variable = (name, value_entity),即name是variable的必要部分。在C++里面,可以认为variable就是value_entity,可能附带某个名字之一(和名字是独立的关系),但至少C里面不是。

2. variable不是value同意。value不是value_entity同意。不过前提是value_entity存在(比如C,C++,perl和go),否则variable就只能是name_entity+value了。如果我没理解错,这里的entity大致上是指的storage location之类的东西,的确在没有value_entity的语言里面这玩意儿被虚化了,或者成为了你说的name_entity,这样才能被垃圾回收,如果这个理解没有错误的话这个我也同意。

所以有一点没有达成共识:我同意在C++里,variable name不是variable的组成部分,因为variable本质上可以有多个名字,并且variable的本质在于你说的value_entity(和字面量的区别在于,这个value_entity必须至少绑定一个名字,而字面量没有名字——可变性并不是问题,因为就算是C++也存在可变的无名entity)。

问题是,我们是讨论的C,在C里,variable是(name, value_entity),一个变量必定有个名字,一个变量在自己存在的条件下,必定与有且仅有一个名字绑定。所以在C中,名字应该是变量的组成部分之一。

另一个相关的话题是const,C/C++的const含义不同时老生常谈了。这里提到他是想说明两者的精确含义:在C++中,const是一个具名的value,而在C中,const是个具名的,不可变的value_entity,即在C中,有所谓“常变量”的说法,即不可变的variable,而C++并不在意这个,因为const本质上只是有名字的value,而并不一定是个(按我的理解)带storage location的value_entity。

关于变量和变量名的观点,我觉得我们应该可以达成共识。如果是这样第二个问题就简单了。我同意你的说法,参与求值的是变量名,在C/C++中,变量名求值本质上都是获取与之匹配的value_entity的value(在C中,value_entity必定只有一个名字,也许没有——这是C99的匿名结构体的特性;在C++中,虽然多个name可以对应一个value_entity,但是决不允许多个value_entity对应一个名字——在当前上下文中,确定了名字就一定确定了有且仅有一个的value_entity),变量在里面起到的作用是提供值,变量作为变量名和值之间的纽带而参与求值,这一点是共识。问题是,在C里面,按照第一条,name是variable的属性之一,即变量名参与求值,我们可以毫无歧义地说是变量在参与求值(在C++中不成立),因此在C中,依然是可以毫无歧义地省略掉“变量名”的说法,而仅仅谈论变量本身参与求值的——前提是对变量名和变量之间的关系要有清晰的认识。

所以,pmerofc在1L的言论(在C中)是没有问题的,而在C++中式有问题的,我估计他自己是没有意识到(我也没意识到,这事儿只有详细讨论了才清楚),这只能说是侥幸说对了,而wwwsg……额……我就不清楚了~

论坛徽章:
0
192 [报告]
发表于 2012-09-26 18:41 |只看该作者
starwing83 发表于 2012-09-26 17:52
回复 189# 幻の上帝



最重要的结论:“变量本身就是表达式”,是基础概念混淆。

老谭对变量和表达式的区别是有清晰概念的,某昏昏只是没读懂而已。

论坛徽章:
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
193 [报告]
发表于 2012-09-26 18:58 |只看该作者
回复 192# wwwsq


    额……你是没看懂我和老幻的发言还是啥…………

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
194 [报告]
发表于 2012-09-26 19:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
195 [报告]
发表于 2012-09-26 21:27 |只看该作者
回复 192# wwwsq


    我明白了, 你说的就是
“变量可以当表达式使用”

“变量是表达式”
的区别。

比拟一下,就是
“人可以当驴使用(拉磨)”

“人就是一种驴”
的区别

论坛徽章:
0
196 [报告]
发表于 2012-09-26 21:29 |只看该作者
本帖最后由 wwwsq 于 2012-09-26 21:30 编辑
folklore 发表于 2012-09-26 21:27
回复 192# wwwsq



没错,基本上就是这意思。

某昏昏和83估计小学的语文课都没认真上,光顾着揪小姑娘的辫子了。

论坛徽章:
0
197 [报告]
发表于 2012-09-26 21:31 |只看该作者
回复 191# starwing83

如果我没理解错,这里的entity大致上是指的storage location之类的东西

没那么具体。storage location是语言特性对此的一种体现。只要能作为确认同一性的东西就可以,不在乎储存在哪里。

其它应该没什么理解上的偏差。

所以在C中,名字应该是变量的组成部分之一。

蛋疼的来了。这个“应该”来得并不靠谱,实际上只是“可以”。没有足够充分和合适的理由表明非得这样做或者这样做有什么特别的好处。

至于const,严格来说是另一回事,不过的确可以和这个问题相关。
const是类型限定符,参与决定类型,在C/C++中一样。C++比C多出来的问题是,C++的const试图尽量让被修饰的variable成为能在编译时确定的constant expression,这时实现就可以在原则上把这个实体当作不存在,只进行值替换。这个在C++11的constexpr得到明显的体现。C++11引入了一个词odr-used来表示必须保证实体定义不能被省略(C++98/03比较笼统,used),而constexpr可以非odr-used,可以没有定义也没有你说的storage location(当然作为object,假想的存在还是有的)。不过,应该是基于一致性,并没有排除出entity(真这样做就得把object分成不是entity的和是entity的两类了……)。所以说你的理解基本没错,不过现实中使用的手段比你提到的更丰富。

照你的逻辑倒是可以勉强说得过去……不过上面的“应该”还是没有解决。我仍然倾向于拒绝这样的用法(虽然我也一直没说这种用法在C里面就是错的),因为有更好的更清晰的替代。
其实ISO C没定义variable是什么倒算了……最坑爹的是ISO C真有自己没给清晰定义的情况下在用entity这个词,而且从上下文来看,是意义高度疑似C++的类似物……真不想在这里把C和C++刻意区分一遍……

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
198 [报告]
发表于 2014-01-10 15:46 |只看该作者
回复 8# wwwsq


    我猜他是想说primary expression,但是我从头到尾没看到说variable是primary expression啊??
请教一下 哪一个变量名 不是primary expression

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
199 [报告]
发表于 2014-08-15 09:43 |只看该作者
回复 8# wwwsq
6.5.1 Primaryexpressions
Syntax
1 primary-expression:
identifier
   


a++ 里面的 a 就是一个 identifier
这怎么不是表达式了
你贴标准文档打了自己的脸了

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
200 [报告]
发表于 2014-08-15 09:54 |只看该作者
是战斗的板块。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP