【发布时间】:2016-03-17 20:51:13
【问题描述】:
Harbison/Steele 的 C 参考说 full declarator 的结尾是一个序列点。但是什么是完整的声明符?
"完整的声明符是不属于另一个声明符的声明符 声明者”
... 什么?
那么举个例子,C 标准会保证int i = 0, *j = &i 将内存地址和变量i 的值存储在指针j 中吗?
换句话说,int i = 0 部分是完整的声明符吗?
【问题讨论】:
Harbison/Steele 的 C 参考说 full declarator 的结尾是一个序列点。但是什么是完整的声明符?
"完整的声明符是不属于另一个声明符的声明符 声明者”
... 什么?
那么举个例子,C 标准会保证int i = 0, *j = &i 将内存地址和变量i 的值存储在指针j 中吗?
换句话说,int i = 0 部分是完整的声明符吗?
【问题讨论】:
不,您正在混合 declarations 和 declarators。
让我引用标准中的 C 语法片段:
declaration:
declaration-specifiers init-declarator-list[opt] ;
init-declarator-list:
init-declarator-list , init-declarator
init-declarator:
declarator
declarator = initializer
然后:
declarator:
pointer[opt] direct-declarator
direct-declarator:
identifier
( declarator )
....
TL;DR:int i = 0; 是一个声明。 i 部分是一个声明符。
如果你有指针,那么关于完整声明符的部分就很清楚了。这一行:
int *p[3] = { 0 };
是一个声明。 *p[3] 部分是完整的声明符,但p[3] 和p 也是(非完整的)声明符。
问你的第一个问题,是的,int i = 0, *j = &i; 很好,因为有两个完整的声明符:i 和 *j。每个完整声明器的末尾都有一个序列点,每个初始化器的末尾还有另一个序列点。你甚至可以写void *p = &p; 就可以了。
【讨论】:
int i = 0, *j = &i; 之间真的有一个序列点在0, 之间吗?附件 C 说:以下是完整的表达式:不属于复合文字 (6.7.9) 的初始值设定项; 显然它是。但我在 6.7.9 中找不到任何相关内容,附件 C 仅供参考。请您指出规则吗?
i 末尾有一个 SP,*j 末尾有一个 SP,0 和 &i 之间的不确定点有一个...:- /
i = i++ 有问题而*p = &p 没有问题吗?为什么不能假设i = i++ 与i++ 具有相同的效果?