Chinaunix

标题: “值”(value)的概念是什么? [打印本页]

作者: fergon    时间: 2012-04-21 11:45
标题: “值”(value)的概念是什么?
在学习《数据结构》时,数据、数据结构、数据类型、抽象数据类型等等都有明确的定义,可是奇怪的是,值一再地被提到,却没有给出一个明确的说法。这让人非常的难受,有哪位能说说吗?
作者: pmerofc    时间: 2012-04-21 12:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: 幻の上帝    时间: 2012-04-21 12:43
在C语言中,值表示被指定特定类型的对象的内容。值可以从左值转换得到,而左值用来表示对象(正式地,左值表示可能是对象的表达式,若不是对象则引起未定义行为)。特别地,右值=值。
在C++中,值是一种不加另行定义的抽象实体(eneity),基本含义和C类似(对象可以储存值,表达式可以表示值)。但值和右值是不同的,后者是一种值类别(value category),属于对表达式的分类,而不是抽象的目标。

作者: 幻の上帝    时间: 2012-04-21 12:49
在更一般的意义上,值是指一个抽象重写系统中的表达式按照某种规则求值后最终(无法进一步规约化简的)一个形式化的结果,即范式。
当然这不表示没有被形式化的语义,在语法和语义规则复杂时用起来不方便,尤其是表达式字面上的含义可能不够明确时。大概就是这个原因C++特地把值和右值区分了出来。

作者: fergon    时间: 2012-04-21 14:02
幻の上帝 发表于 2012-04-21 12:49
在更一般的意义上,值是指一个抽象重写系统中的表达式按照某种规则求值后最终(无法进一步规约化简的)一个 ...


哪么,是否可以认为:值是与类型紧密相关的,在一定程度上类型是值的解释?而值是数据的一种存在形式?

在《数据结构 数据结构(C语言版)》[严蔚敏_吴伟民]中给数据类型的定义是:一个值的集合和定义在这个值集上的一组操作的总称。
也就是说,类型确定了值的形式?
作者: bruceteen    时间: 2012-04-21 15:00
God 的令我情不自禁的“Oh,My God!”
虽然我看不懂,但已然能感到你绝对牛逼的样子
顶你
作者: 幻の上帝    时间: 2012-04-21 16:38
回复 5# fergon

可以这样理解。
并且在C语言中就应该这样(虽然实际上还是有些区别:“一组操作”不是语言规则支持限定的,用C表达不那么直接)。


作者: fergon    时间: 2012-04-21 20:42
非常感谢 幻の上帝!
一直以来,对数据结构和数据类型、值、数据的概念不清楚,虽然现在还是不太清楚,但感觉上还是有点进步了。
在学习scala的时候,越发的发现自己的基础实在是太差了,没法继续学习下去,所以决定回过头来温习一下!
thanks!
作者: xiangziluotuo    时间: 2012-04-23 21:52
表示不解。。。值就是值吗。。。
作者: smalloc    时间: 2012-04-23 22:59
需要解释的这么饶口?
左值是容器,右值是内容。区别在于能否使用= 赋值
一个概念上容易搞混的是,有时候左值也被转化为右值。

作者: pmerofc    时间: 2012-04-23 23:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: fergon    时间: 2012-04-23 23:14
smalloc 发表于 2012-04-23 22:59
需要解释的这么饶口?
左值是容器,右值是内容。区别在于能否使用= 赋值
一个概念上容易搞混的是,有时候 ...


左值是容器吗?区别在于赋值吗?
哪么,这个表达式  static int const a = 0; a 是左值还是右值?

我觉得左值和右值的定义好象尚未有一个定论的。
不搞清楚这些基础概念,去学习一些新的东西时,就会把自己弄得很混乱,知道一些和了解全貌会有很大的不同。
作者: smalloc    时间: 2012-04-23 23:41
回复 11# pmerofc


    请给个例子,不能赋值的左值
作者: smalloc    时间: 2012-04-23 23:41
回复 12# fergon


    在这行语句中a是左值。
作者: fergon    时间: 2012-04-23 23:45
哪a就是不能赋值呀。
作者: pmerofc    时间: 2012-04-23 23:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: smalloc    时间: 2012-04-24 07:44
回复 15# fergon


    别告诉我这里的 = 不是赋值运算符
作者: fergon    时间: 2012-04-24 10:54
smalloc 发表于 2012-04-24 07:44
回复 15# fergon


你认为初始化跟赋值是一样的吗?
如果说这个初始化语句 static const int a  = 0 ; 也算是赋值。
哪么,
    enum { A = 100,B,C};//按理说,A也应该是个左值了?
作者: KBTiller    时间: 2012-04-24 11:03
回复 1# fergon


    楼主这样认真对待基本概念,难能可贵
  http://bbs.chinaunix.net/thread-2305110-24-1.html
   239楼有一个C语言层面的定义,供参考
作者: fergon    时间: 2012-04-24 11:17
KBTiller 发表于 2012-04-24 11:03
回复 1# fergon

谢谢!
俺一向就是个学习不认真的人,受的教训太多了。
导致现在见到啥都疑惧。

作者: gtkmm    时间: 2012-04-24 11:50
value比较麻烦。。。不好说明白。

不过左值右值好说,
左值与是否const无关,左值仅指语法上是否是成立的。

右值通常是一些字面上东西,值的内容是编译期己知的,不可能在运行期改变。
比如
3+2
”hello world"
enum
函数名

剩下的,都是左值了。

作者: fergon    时间: 2012-04-24 12:38
gtkmm 发表于 2012-04-24 11:50
value比较麻烦。。。不好说明白。

不过左值右值好说,


int a = 0;

a = a; //记得在<<c++primer>>里提到,a 同时充当了左值与右值的角色,似乎不能用是否编译期、运行期来解释呀!

我以前也查过一些相关的资料,好象在  汇编语言有汇编语言的解释,C语言也有C语言的说法,c++也有自己的一套。

这些对我来说太复杂了,所以但凡涉及到左值和右值,基本上我都放弃不管了。但值的概念在函数式语言里是非常常见的概念,

不搞懂它,很多东西都弄不来,所以我才有此一问。
作者: gtkmm    时间: 2012-04-24 14:16
fergon 发表于 2012-04-24 12:38
int a = 0;

a = a; //记得在里提到,a 同时充当了左值与右值的角色,似乎不能用是否编译期、运行期来 ...


左值都能当右值。。
作者: pmerofc    时间: 2012-04-24 14:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: gtkmm    时间: 2012-04-24 14:38
pmerofc 发表于 2012-04-24 14:23
回复 21# gtkmm


不是。在右值
作者: 塑料袋    时间: 2012-04-24 14:44
值是值,数是数。
左值是左值,右值是右值。
左值不是右值,右值也不是左值。
值不是数,数也不是值。
要是把左值当成右值,
或者把右值当成左值,
那他根本不懂左值和右值。
要是把数当成值,
或者把值当成数,
那他也根本不懂数和值。
更不懂左值和右值。
作者: pmerofc    时间: 2012-04-24 15:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: 塑料袋    时间: 2012-04-24 15:55
pmerofc 发表于 2012-04-24 15:29
回复 25# gtkmm

理由?


机器不擦要生锈,人不学习要变修,今天大哥我就教教你,什么叫“值”:

值是值,数是数。
左值是左值,右值是右值。
左值不是右值,右值也不是左值。
值不是数,数也不是值。
要是把左值当成右值,
或者把右值当成左值,
那他根本不懂左值和右值。
要是把数当成值,
或者把值当成数,
那他也根本不懂数和值。
更不懂左值和右值。
作者: fergon    时间: 2012-04-24 16:10
塑料袋 发表于 2012-04-24 14:44
值是值,数是数。
左值是左值,右值是右值。
左值不是右值,右值也不是左值。


愿闻其详!越详细越好。
作者: fergon    时间: 2012-04-24 16:20
难道是要我意会?!!
作者: 塑料袋    时间: 2012-04-24 16:28
fergon 发表于 2012-04-24 16:10
愿闻其详!越详细越好。


没法详细阿。

地址就是选中,值就是写数,读写线就是锁存,这就完了阿。
作者: smalloc    时间: 2012-04-24 16:29
回复 30# fergon


    看看 逻辑实证主义 中的 语言的逻辑句法。
作者: fergon    时间: 2012-04-24 16:56
smalloc 发表于 2012-04-24 16:29
回复 30# fergon


哲学? 我功力不够呀,学起来轻则走火入魔,重则能把黑格尔气死。等我满头白发的时候,或者会练一练,呵呵!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2