【问题标题】:What is a full declarator in C?什么是 C 中的完整声明符?
【发布时间】:2016-03-17 20:51:13
【问题描述】:

Harbison/Steele 的 C 参考说 full declarator 的结尾是一个序列点。但是什么是完整的声明符?

"完整的声明符是不属于另一个声明符的声明符 声明者”

... 什么?

那么举个例子,C 标准会保证int i = 0, *j = &i 将内存地址和变量i 的值存储在指针j 中吗?

换句话说,int i = 0 部分是完整的声明符吗?

【问题讨论】:

    标签: c syntax


    【解决方案1】:

    不,您正在混合 declarationsdeclarators

    让我引用标准中的 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 仅供参考。请您指出规则吗?
    • @2501。 C标准的附件C列出了所有的序列点,这里你可以阅读“在一个完整表达式的求值和下一个要求值的完整表达式之间。。以下是完整的表达式:一个不是部分的初始化器复合文字的;[...]".我个人觉得措辞有点混乱,因为如果在这个完整表达式和下一个要评估的完整表达式之间有额外的代码怎么办? SP去哪儿了?我只想说“在完整表达式的末尾”。
    • @2501:哦,我明白了。看 6.8,第 4 段:“在一个完整表达式的求值和下一个要求值的完整表达式的求值之间有一个序列点。” 还有:“一个完整的表达式是一个不属于另一个表达式或声明符的表达式。”(请注意,初始化程序是声明的一部分,但不是声明符的一部分)。还有:"...是一个完整的表达式:一个不属于复合文字的初始化器,...".
    • @2501: 所以i 末尾有一个 SP,*j 末尾有一个 SP,0&i 之间的不确定点有一个...:- /
    • 只有一个问题:你能告诉我为什么i = i++ 有问题而*p = &p 没有问题吗?为什么不能假设i = i++i++ 具有相同的效果?
    猜你喜欢
    • 2015-12-17
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多