C++ 运算符“*”是左结合还是右结合?
Is C++ operator "*" left-associative or right-associative?
我有一个测试程序可以试试这个:
int main()
{
int i = 1;
int* p, q;
p = &i;
//q = &i;//q is not pointer
int* buf[20];//type of element is int*
return 0;
}
(1) 我发现 q
不是指针,所以 int *p
星号似乎是右结合的。
(2) 但对于 int* buf[20]
,我发现 buf
一个包含 20 个元素的数组,每个元素的类型为 int*
。所以在第 5 行中,星号似乎是左结合的。
那么 *
与表达式的其他部分(左关联或右关联)或应用于其他规则的确切规则是什么?
声明由一系列说明符和后面的一系列声明符组成。每个声明符声明一个名称。每个说明符 独立地应用于每个声明符。 因此在
int* p, q;
说明符 int
适用于 p
和 q
。但是,*
不是说明符,而是声明符 *p
的一部分,因此它仅适用于 p
.
*
绑定到其右侧的实体,但它的优先级低于 []
和 ()
。此优先规则与表达式的相同。 &
和 &&
(仅限 C++)与 *
具有相同的优先级。在
int* buf[20];
有一个说明符 int
和一个声明符 *buf[20]
,并且 [20]
绑定得更紧密,所以它是一个指针数组,而不是指向数组的指针,基类型是 int
,所以它是指向 int
的指针数组。
可以通过括号更改绑定:
int* buf[20]; // array of pointers
int (*buf)[20]; // pointer to array
这是正确的
int* p, q;
因为它是 int* p 或 int *p 无关紧要,这里的问题是 q 在逗号之后,如果您希望它也成为指针,则需要另一个指针 *。
这一行:
int* buf[20];//type of element is int*
也做了该做的,声明了一个int指针数组,和int *buf[20]
一样
我有一个测试程序可以试试这个:
int main()
{
int i = 1;
int* p, q;
p = &i;
//q = &i;//q is not pointer
int* buf[20];//type of element is int*
return 0;
}
(1) 我发现 q
不是指针,所以 int *p
星号似乎是右结合的。
(2) 但对于 int* buf[20]
,我发现 buf
一个包含 20 个元素的数组,每个元素的类型为 int*
。所以在第 5 行中,星号似乎是左结合的。
那么 *
与表达式的其他部分(左关联或右关联)或应用于其他规则的确切规则是什么?
声明由一系列说明符和后面的一系列声明符组成。每个声明符声明一个名称。每个说明符 独立地应用于每个声明符。 因此在
int* p, q;
说明符 int
适用于 p
和 q
。但是,*
不是说明符,而是声明符 *p
的一部分,因此它仅适用于 p
.
*
绑定到其右侧的实体,但它的优先级低于 []
和 ()
。此优先规则与表达式的相同。 &
和 &&
(仅限 C++)与 *
具有相同的优先级。在
int* buf[20];
有一个说明符 int
和一个声明符 *buf[20]
,并且 [20]
绑定得更紧密,所以它是一个指针数组,而不是指向数组的指针,基类型是 int
,所以它是指向 int
的指针数组。
可以通过括号更改绑定:
int* buf[20]; // array of pointers
int (*buf)[20]; // pointer to array
这是正确的
int* p, q;
因为它是 int* p 或 int *p 无关紧要,这里的问题是 q 在逗号之后,如果您希望它也成为指针,则需要另一个指针 *。
这一行:
int* buf[20];//type of element is int*
也做了该做的,声明了一个int指针数组,和int *buf[20]
一样