C++运算符"*"是左结合还是右结合?

3

我有一个测试程序来尝试这个:

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行,星号似乎是左结合的。
那么,*与表达式的其他部分关联的确切规则是什么,是左结合还是右结合,还是适用于其他规则?

pq是不同的变量,它们可能是不同的类型。但是无法声明一个数组,其中第一个元素是指针,而第二个元素不是。 - songyuanyao
我认为你对此过于深究了。第一行声明了两个单独的项,而另一行声明了一个单独的项(一个数组)。 - PaulMcKenzie
int p, *q, r[3], *s[3], (*t)[3]; 中,pintq 是指向 int 的指针,rint 数组,s 是指向 int 的指针数组,而 t 是指向 int 数组的指针。 - Dmitri
你的代码中没有包含任何 operator* - juanchopanza
类型中的星号不是二元运算符,它没有结合性。结合性只在具有两个或更多二元运算符的表达式中才有意义。乘法运算符 * 是左结合的,这意味着 a * b * c(a * b) * c 而不是 a * (b * c) - molbdnilo
2个回答

9

一个声明由一系列的说明符(specifiers)和声明符(declarators)组成。每个声明符声明一个名称。每个说明符独立地应用于每个声明符。因此,在

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

0

这个正常工作

int* p, q;

无论是int* p还是int *p,问题在于q在逗号后面,如果你想让它也成为指针,就需要再加一个*。

这一行:

int* buf[20];//type of element is int*

它也做了它应该做的事情,声明了一个 int 指针数组,这与 int *buf[20] 相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接