- 论坛徽章:
- 5
|
回复 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……额……我就不清楚了~ |
|