C定义中的运算符优先级

时间:2011-01-22 19:13:23

标签: c definition operator-precedence

Wikipedia声称[]运算符在评估中位于*运算符之前。

然后,为什么以下声明:

char *a[3];

声明一个包含3个字符指针的数组,而不是根据运算符优先级指向3个字符数组的指针?

3 个答案:

答案 0 :(得分:7)

正如维基百科所说,[]的优先级高于*

处理声明后,a[3]会在处理*之前被处理为'数组3'。

要声明指向三个字符数组的指针,必须使用括号覆盖默认优先级:

char (*a)[3];

现在圆括号优先于数组。

答案 1 :(得分:2)

以下是standard(第6.7.5节)中声明者的语法:

declarator:
    pointeropt direct-declarator

direct-declarator:
    identifier
    ( declarator )
    direct-declarator [ type-qualifier-listopt assignment-expressionopt ]
    direct-declarator [ static type-qualifier-listopt assignment-expression ]
    direct-declarator [ type-qualifier-list static assignment-expression ]
    direct-declarator [ type-qualifier-listopt * ]
    direct-declarator ( parameter-type-list )
    direct-declarator ( identifier-listopt )

pointer:
    * type-qualifier-listopt
    * type-qualifier-listopt pointer

type-qualifier-list:
    type-qualifier
    type-qualifier-list type-qualifier

parameter-type-list:
    parameter-list
    parameter-list , ...

parameter-list:
    parameter-declaration
    parameter-list , parameter-declaration

parameter-declaration:
    declaration-specifiers declarator
    declaration-specifiers abstract-declaratoropt

identifier-list:
    identifier
    identifier-list , identifier

如您所见,[]()都绑定到*之前的声明符。接受声明

int *a[N];

声明符是*a[N],它符合上面的指针 opt direct-declarator 模式,因此被解析为*(a[N]),所以{ {1}}是指针的N元素数组。

总结一下:

a

答案 2 :(得分:0)

我对这个问题很困惑 - 声明的解释与运算符优先级相匹配。如果你想要一个指向数组的指针,你必须使用parens在*绑定之前将[]绑定到“标识符”。

char (*a)[3];