C定义中的运算符优先级
声明在求值过程中,C定义中的运算符优先级,c,definition,operator-precedence,C,Definition,Operator Precedence,声明在求值过程中,[]运算符先于*运算符 那么,为什么会有以下说法: char *a[3]; 声明一个由3个字符组成的数组指针,而不是根据运算符优先级声明一个指向3个字符数组的指针 因为正如维基百科所说,[]的优先级高于* 处理声明时,a[3]在处理*之前被处理为“3的数组” 要声明指向三个字符数组的指针,必须使用括号覆盖默认优先级: char (*a)[3]; 现在括号优先于数组。我对这个问题感到困惑-声明的解释与运算符的优先级匹配。如果需要指向数组的指针,则必须在绑定[]之前使用pare
[]
运算符先于*
运算符
那么,为什么会有以下说法:
char *a[3];
声明一个由3个字符组成的数组指针,而不是根据运算符优先级声明一个指向3个字符数组的指针 因为正如维基百科所说,
[]
的优先级高于*
处理声明时,a[3]
在处理*
之前被处理为“3的数组”
要声明指向三个字符数组的指针,必须使用括号覆盖默认优先级:
char (*a)[3];
现在括号优先于数组。我对这个问题感到困惑-声明的解释与运算符的优先级匹配。如果需要指向数组的指针,则必须在绑定
[]
之前使用parens将*
绑定到标识符
char (*a)[3];
以下是来自(§6.7.5)的声明符语法: 如您所见,
[]
和()
在*
之前绑定到声明符。以宣言为例
int *a[N];
声明符是*a[N]
,它符合上面的pointeropt直接声明符模式,因此被解析为*(a[N])
,因此a
是指针的N元素数组
总而言之:
T *a[N] -- declares an N-element array of pointer to T
T (*a)[N] -- declares a pointer to an N-element array of T
T *f() -- declares a function returning pointer to T
T (*f)() -- declares a pointer to a function returning T
但是,声明难道不像其他答案中所说的那样有单独的解释规则吗?@crypto,C语言中声明语法的全部要点是“声明模仿使用”。@crypto:不,不是真的。正如@AProgrammer所说,C声明系统的设计是这样的:声明模仿使用。因此,
a[0]
是一个char*
,而*a[0]
是一个char
@crypto:请看下面我的答案。是的,声明有不同的产生式规则,但它们遵循与表达式相同的优先级规则。类似:具体参见关于cdecl
T *a[N] -- declares an N-element array of pointer to T
T (*a)[N] -- declares a pointer to an N-element array of T
T *f() -- declares a function returning pointer to T
T (*f)() -- declares a pointer to a function returning T