C++ 优先级和关联性

C++ Precedence and Associativity

这段代码:

int scores[] {1,2,3,4};
int *score_ptr {scores};  
//let's say that initial value of score_ptr is 1000
std::cout<<*score_ptr++;

产生输出:

1

因为 *++ 具有相同的优先级,然后关联性是从右到左我们不应该先应用 ++ 运算符,即先增加指针然后 *(取消引用)它?

因此相应地 score_ptr 将增加到 1004 然后取消引用它将给出分数的第二个元素,即 2.

这如何以及为什么给我输出 1 而不是 2

增量会先发生,它有更高的优先级,它等价于*(score_ptr++),但它是一个post-增量,这意味着它只会在使用解引用指针之后发生,即表达式达到 ;.

如果你使用

std::cout << *++score_ptr;

然后你有一个预递增,这里它会预先发生,指针会在使用值之前递增,输出将是2。相当于*(++score_ptr).

请注意,使用括号始终是个好主意,它会使代码更清晰并避免误解。

As * and ++ have same precedence

不,后缀 operator++ 有更高的 precedence than operator*; then *score_ptr++ is equivalent to *(score_ptr++). Note that the postfix operator++ 会增加操作数和 return 原始值,然后 *(score_ptr++) 会给出值 1

The result is prvalue copy of the original value of the operand.

另一方面前缀 operator++ returns 递增的值。如果您将代码更改为 *++score_ptr(相当于 *(++score_ptr)),那么结果将是 2(这可能是您所期望的)。