这段代码:
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
?
由于
和*
具有相同的优先级++
不,后缀
operator++
比operator*
具有更高的优先级;那么
*score_ptr++
就相当于 *(score_ptr++)
。请注意,后缀 operator++
会递增操作数并返回原始值,然后 *(score_ptr++)
将给出值 1
。
结果是操作数原始值的纯右值副本。
另一方面,前缀
operator++
返回递增值。如果您将代码更改为 *++score_ptr
(相当于 *(++score_ptr)
),那么结果将是 2
(这可能是您所期望的)。
增量会首先发生,它具有更高的优先级,它相当于
*(score_ptr++)
,但它是后增量,这意味着它只会在使用取消引用的指针之后发生,即表达式达到;
。
如果您使用
std::cout << *++score_ptr;
然后你有一个预递增,这里它会预先发生,指针将在使用值之前递增,输出将为
2
。相当于*(++score_ptr)
。
请注意,使用括号总是一个好主意,它会使代码更清晰并避免误解。