C++ 优先级和关联性[重复]

问题描述 投票:0回答:2

这段代码:

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

c++ pointers computer-science operator-precedence
2个回答
7
投票

由于

*
++
具有相同的优先级

不,后缀

operator++
operator*具有更高的
优先级
;那么
*score_ptr++
就相当于
*(score_ptr++)
。请注意,后缀
operator++
会递增操作数并返回原始值,然后
*(score_ptr++)
将给出值
1

结果是操作数原始值的纯右值副本。

另一方面,前缀

operator++
返回递增值。如果您将代码更改为
*++score_ptr
(相当于
*(++score_ptr)
),那么结果将是
2
(这可能是您所期望的)。


1
投票

增量会首先发生,它具有更高的优先级,它相当于

*(score_ptr++)
,但它是后增量,这意味着它只会在使用取消引用的指针之后发生,即表达式达到
;

如果您使用

std::cout << *++score_ptr;

然后你有一个预递增,这里它会预先发生,指针将在使用值之前递增,输出将为

2
。相当于
*(++score_ptr)

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

© www.soinside.com 2019 - 2024. All rights reserved.