Harbison / Steele的C引用说明完整声明符的结尾是一个序列点。但什么是完整的声明者?
“完整的声明者是不属于另一个的声明者 说明符“
... 什么?
举一个例子,C标准是否保证int i = 0, *j = &i
在指针i
中存储变量j
的内存地址?
换句话说,int i = 0
部分是完整的声明者吗?
答案 0 :(得分:8)
不,您正在混合声明和声明者。
让我引用标准中的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;
就可以了。