CG@CPPBLOG

/*=========================================*/
随笔 - 76, 文章 - 39, 评论 - 137, 引用 - 0
数据加载中……
@咸鱼
灰色部分是我删掉的原来错误的部分,看来引起了误解。我把它删掉。
re: 我的SICP习题答案(1.7) cuigang 2010-02-19 22:21
@mxj

(define (sqrt-new x)
(sqrt-iter-new x 1.0 x))

这句估计你写成了
(define (sqrt-new x)
(sqrt-iter-new x 1 x))

用了整数 1 而不是浮点数 1.0
@lwcore

当时还没有找到合适的解释器,另外,scheme解释器调试功能都不好用
re: 我的SICP习题答案(1.9) cuigang 2010-02-19 21:01
@guava

呵呵
re: 推荐 SICP[未登录] cuigang 2008-09-24 21:07
@jeffrey
请指教
re: In USA - 1[未登录] cuigang 2008-08-14 01:18
@创
从精华页取消了。
@xiaokang

n 是 钱数(美分)。
@xiaokang

的确写错了,应该是
(define (smooth-n f n)
((repeated smooth n) f))

谢谢指正。
@raof01

这句话说得确实有问题,应该是把表达式的值(右值)作为地址(但不是表达式的左值),取出内容。

谢谢指正。
@paoapo
是的,我写错了,已经改过来了,谢谢。
re: 推荐 SICP[未登录] cuigang 2008-06-27 21:19
@raof01
基本数学知识就行。
re: 推荐 SICP cuigang 2008-06-23 22:44
@raof01
除了数学,只是需要耐心。《计算机程序的构造和解释》、The Book、purple book。
@perddy

你想说明什么呢?
@dawn.soup

我会努力的
@raof01

善哉善哉
@raof01

本来我以为我们的观点接近了,但是看到你说 x + 1 的 x 是左值, 我就知道我们根本没有持相同观点.

现在,我解释一下为什么 x + 1 中的 x 是右值, 首先要明确对于一个表达式,究竟是左值还是右值, 取决于它在表达式中的位置, 它并不是一定为左值或者右值,这一点你可以去看c++标准,如果你对这点都不认同,我们其实已经无法再继续讨论了。

其次,对于一个表达式,它都会有一个对象和它对应,无论它是一个变量,还是能产生一个临时对象,或者是一个字面常量(自演算表达式). 这一点你应该是同意的. 那么一个对象, 其实是一个映射关系, 它实际存在在内存中(或者寄存器中), 它一定有位置信息和值信息(当然得到值还需要类型信息), 符号表是在编译时转换用的,运行时虽然没有这个表存在,但这个映射关系是存在的. 变量就表示了这层关系.

表达式 x 的运算结果就是 x , 但是这个运算结果是 x 本身吗? 答案是否定的, 众所周知, 内存单元是无法做算术运算的, x 的值 需要被取到 寄存器中, 然后才能加 1 . 如果你看汇编, 你会看到 一个 类似 lea 的指令, 所以 x 代表了它的值(先不管是左值还是右值).

对于一个非引用类型的a, a=b , 是会让 a 和 b 变成同一个对象吗? 不是, 只是让 a 和 b 的值相等.

象basic那样,给赋值加上一个let, let a = b, 这个a 是符号表中的那个a吗? 一定. b是符号表中那个b吗? 不必. 其实编译器也是这么认为的, 如果 b 的值 已经被取到寄存器,它不会再取一次. 就象读起来那样, 让a等于b, 只要跟b相等就好, b的位置在哪里无所谓, 但a在哪里就很重要了,否则就会给错人.

说的很乱,可能看不懂,其实回到本来的字面,左值就是放到等号左边的值,右值就是放到右边的值. 从 a = b 可以看出, 左值表示位置, 右值表示内容(也就是值).

再回到 x + 1, x + 1 会改变 x 吗? 不会, 那么不一定需要x ,更不需要 x 的位置, 一个和 x 相等的对象也行, 所以, 这里的x 是右值.

对于非命令式语言, 就没有左右值的烦恼, 命令式语言着实的麻烦. 怎么做的,解释起来都费劲.

呵呵.

@raof01

你要说 x + 1 中的 x 是左值, 我真的很无奈。
@raof01

跟你先前的评论比较,想必你最近也深入研究了这个问题,虽然言语之中仍然为自己辩护,不过大家观点毕竟更加接近了,其实我们对于这个问题的理解可能都有少许偏差,但讨论之后一定更加接近正确了。

谢谢你捧场。
@Xshl5

看来你还比较执着。 int [N] 是类型是无容置疑的。建议看 ISO 14882
@ww

啸天猪的链接你看一下,&只能对左值表达式取址。我就不用再废话了。
@啸天猪

你提供的链接解释很充分,希望你自己也能自己看一下
@raof01

1、我并非说我的左值右值描述是定义,但是你的依靠是否可修改的判断却反而是错的,一个const变量x,表达式 x 仍然有右值,但是不代表 x 可修改。关于左值和右值,ISO C++ 98版标准这样说:

An lvalue for an object is necessary in order to modify the object except that an rvalue of class type can also be used to modify its referent under certain circumstances.

而《C++ primer》4th 这样说:

存储数据值的那块内存的地址,它有时被称为变量的左值lvalue,读作ell-value,我们也可认为左值的意思是位置值(location value)。

左值代表了一个可被程序寻址的对象,可以从该对象读取一个值,除非该对象被声明为const,否则它的值也可以被修改。相对来说,右值只是一个表达式,它表示了一个值,或一个引用了临时对象的表达式,用户不能寻址该对象,也不能改变它的值。

2、我承认对于 * 操作符用于左值的描述有问题,应该说 解引用操作符 用于指针类型,但 & 操作符的确只能应用于有左值的表达式,看C++ 标准这样说:

The result of the unary & operator is a pointer to its operand. The operand shall be and lvalue or a qualified-id.

The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points.

至于你链接的文章,请恕我未能洞悉,不知里面哪里提到 解引用操作符可以用于右值,或者隐含此意味。

虽然标准中没有说 解引用操作符 到底是用在左值还是右值表达式上,但是间接寻址(indirection)反而说明了你的观点,它是将指针变量的右值作为地址来访问指向物,类似的有
‘.’,‘->’运算符。

3、我说指向数组的指针费解,不是说我不理解,只是说大多数人实际中难以见到,不好理解,如果你可以理解,你可以说说它和多维数组 arr[][] 的 指针 arr[2] 有什么区别。

re: 空对象模式 cuigang 2008-04-07 23:21
@Su, Awen

new 一个对象,首先 使用 new 操作符 在堆中申请空间,然后调用构造函数初始化对象,如果有虚函数,会构造 vptr 指向 虚表, vptr 在 this 所指处。

例子中 Mail 重载了 new 操作符,返回 NullMail 单例的地址,虽然没有声明构造函数,但编译器会提供缺省构造函数,这会将 NullMail 的 指向虚表的 vptr 改为 Mail 的 vptr(new 出来的 Mail::this 实际指向 NullMail)。


re: 对数组名取地址是什么? cuigang 2008-04-07 22:53
@Xshl5
@超人

关于函数类型和数组类型的问题虽然表现不一致,但是原因是一样的,因为说明比较长,我重新开一文说明:

http://www.cppblog.com/cuigang/archive/2008/04/07/46464.html

至于数组名和函数名确实分别是数组类型和函数类型的问题,你可以去看C++ 标准 ISO14882。




@Santa
仅仅认为数组名是个指针,是不行的。首先 array 不是一个变量,对它取地址是件很费解的事情,它并不在内存中,可能只是一个链接时常量。另外,即便 array 是一个变量,存在内存中,它的地址等于自己的值,恐怕更加头大。
re: 谨记于此[未登录] cuigang 2008-03-30 23:37
@ood

我其实并不是想讨论哲学,也没有资格讨论哲学,因为我不懂。当然我自有我的哲学,我认同什么(我都不知道有哪些可供认同)或者我的哲学(观点?)是什么?我以为这不重要,因为那只是我的,永远都无法变成你的,当然你也不需要,关键是你的哲学是什么,你找到它了吗?

呵呵,好像在说胡话。
re: 谨记于此[未登录] cuigang 2008-03-30 21:52
@turingbook

唯有变化不变
re: 推荐 SICP[未登录] cuigang 2008-03-19 21:39
@haskell
下了个Concepts Techniques and Models of Computer Programming的电子版,翻了一下,太厚了,5年以后再看吧,实在是没时间呀。
re: 推荐 SICP cuigang 2008-03-19 13:58
@kong
谢谢 kong 提供了一个连接给我,我会去看的,我已经把它收藏到我的连接中去了,也谢谢你浏览我的blog
谢谢浏览
@3fen
@leo
感谢两位关注,我最近仔细研究了这个问题,觉得以前理解是有问题,已经更新了答案
@3fen
我也很困惑,虽然网上很多答案都和我的不同,但是我没办法解释,只好认为我的是对的了。