通过指针递增成员 int 时,++ 和 -> 的运算符优先级如何工作?
How does the operator precendence of ++ vs -> work when incrementing incrementing a member int through a pointer?
C++ 语言律师的问题。它看起来很简单,但我正试图弄清楚我的简单程序到底发生了什么。
struct A
{
int data1;
int data2;
};
int main()
{
A myA;
A* ptr = &myA;
ptr->data1 = 100;
++ptr->data1;
std::cout << "A: " << myA.data1 << std::endl;
return 1;
}
以上在我的 gcc 4.8.2 上正确运行并输出 101。
根据我在网上阅读的内容,++ 和 -> 运算符具有相同的优先级 (https://msdn.microsoft.com/en-us/library/126fe14k.aspx),因此我希望优先级从左到右。
如果我解释从左到右的优先顺序,那么我希望 ++ptr 先执行而不是 ptr->data1。这将导致明显不同(和不正确)的结果。
我在这里错过了什么?
前缀 ++
的优先级低于 ->
。因此,表达式
++ptr->data1;
与
相同
++(ptr->data1);
http://en.cppreference.com/w/cpp/language/operator_precedence
如您所见,您使用的 ++ 运算符是一个前缀运算符,它的杠杆优先级低于 ->.
后缀运算符与 -> 级别相同。
->
的操作顺序高于您调用的 prefix ++
增量。所以 ->
首先被调用。
->
与 postfix ++
增量具有相同的优先顺序,相当于以下语句...
ptr++->data
。我不确定,但我认为这甚至无法解析。
C++ 语言律师的问题。它看起来很简单,但我正试图弄清楚我的简单程序到底发生了什么。
struct A
{
int data1;
int data2;
};
int main()
{
A myA;
A* ptr = &myA;
ptr->data1 = 100;
++ptr->data1;
std::cout << "A: " << myA.data1 << std::endl;
return 1;
}
以上在我的 gcc 4.8.2 上正确运行并输出 101。
根据我在网上阅读的内容,++ 和 -> 运算符具有相同的优先级 (https://msdn.microsoft.com/en-us/library/126fe14k.aspx),因此我希望优先级从左到右。
如果我解释从左到右的优先顺序,那么我希望 ++ptr 先执行而不是 ptr->data1。这将导致明显不同(和不正确)的结果。
我在这里错过了什么?
前缀 ++
的优先级低于 ->
。因此,表达式
++ptr->data1;
与
相同++(ptr->data1);
http://en.cppreference.com/w/cpp/language/operator_precedence 如您所见,您使用的 ++ 运算符是一个前缀运算符,它的杠杆优先级低于 ->.
后缀运算符与 -> 级别相同。
->
的操作顺序高于您调用的 prefix ++
增量。所以 ->
首先被调用。
->
与 postfix ++
增量具有相同的优先顺序,相当于以下语句...
ptr++->data
。我不确定,但我认为这甚至无法解析。