4

在丹尼斯里奇我发现了这个,

struct rect r , *rp = r;

那么这四个表达式是等价的:

  1. r.pt1.x
  2. rp->pt1.x
  3. (r.pt1).x
  4. (rp->pt1).x

因为运算符从左到右关联。
不应该是 struct rect *rp = &r 吗?

4

3 回答 3

1

是的,它绝对应该,因为它rp是一个指向 - 的指针struct rect,而r它是类型的struct rect。可能是书上的错别字?

于 2013-05-21T17:22:25.057 回答
1

绝对 - 地址运算符是必需的,否则会出现编译时错误

incompatible types when initializing type ‘struct rect *’ using type ‘struct rect’
于 2013-05-21T17:22:29.007 回答
0

这是书中的一个错字,在后来的版本中已经更正了。

有问题的书是“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之后恢复为其最新值。setjmplongjmp

(是的,短语“自动变量”应该是“自动变量”。)

于 2013-05-21T21:25:04.100 回答