是C ++运算符" *"左联想还是右联想?

时间:2016-07-04 02:27:51

标签: c++ 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行中,星号似乎是左关联的。

那么*与表达式的其他部分,左关联或右关联或应用于其他规则的确切规则是什么?

2 个答案:

答案 0 :(得分:9)

声明由一系列说明符组成,后跟一系列声明符。每个声明者声明一个名称。每个说明符都独立地应用于每个声明符因此在

int* p, q;

说明符int适用于pq。但是,*不是说明符,而是声明符*p的一部分,因此它仅适用于p

*绑定到其右侧的实体,但其优先级低于[]()。此优先级规则与表达式的规则相同。 &&&(仅限C ++)具有与*相同的优先级。在

int* buf[20];

有一个说明符int和一个声明符*buf[20][20]绑定得更紧,所以它是一个指针数组,而不是指向数组的指针,并且基类型为int,因此它是指向int的指针数组。

可以通过括号更改绑定:

int* buf[20]; // array of pointers
int (*buf)[20]; // pointer to array

答案 1 :(得分:0)

这是正常的

0x98548

因为它最重要的是它是int * p或int * p,所以这里的问题是q在逗号之后需要另一个指针*如果你想要它也是一个指针。

这一行:

int* p, q;

也应该做什么,声明int指针数组,这与int * buf [20]

相同