在丹尼斯里奇我发现了这个,
struct rect r , *rp = r;
那么这四个表达式是等价的:
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
因为运算符从左到右关联。
不应该是 struct rect *rp = &r 吗?
在丹尼斯里奇我发现了这个,
struct rect r , *rp = r;
那么这四个表达式是等价的:
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
因为运算符从左到右关联。
不应该是 struct rect *rp = &r 吗?
是的,它绝对应该,因为它rp
是一个指向 - 的指针struct rect
,而r
它是类型的struct rect
。可能是书上的错别字?
绝对 - 地址运算符是必需的,否则会出现编译时错误:
incompatible types when initializing type ‘struct rect *’ using type ‘struct rect’
这是书中的一个错字,在后来的版本中已经更正了。
有问题的书是“The C Programming Language”,第 2 版,作者 Kernighan 和 Ritchie,通常称为“K&R2”。它通常不被称为“里奇”,因为他只是两位作者之一。(你们中的一些人可能有兴趣知道它现在可以作为 Kindle 电子书使用。)
这本书的勘误表说:
后来在 1989 年 10 月的印刷中,在第 131 页(§6.2)中进行了微小的更改,以添加
&
到最后一个示例(struct rect r, *rp = &r;
),在第 208 页(§A.17)中将逻辑描述中的“等于”更改为“不等于”或,并在第 254 页(§B.8)阐明对于自动变量,只有那些声明的变量在/序列volatile
之后恢复为其最新值。setjmp
longjmp
(是的,短语“自动变量”应该是“自动变量”。)