[英]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++;
产生 output:
1
由于*
和++
具有相同的优先级,然后关联性是从右到左,我们不应该先应用++
运算符,即先增加指针然后*
(取消引用)吗?
因此, score_ptr
将相应地增加到1004
,然后取消引用它将给出分数的第二个元素,即2
。
这如何以及为什么给我 output 的1
而不是2
?
因为
*
和++
具有相同的优先级
不,后缀operator++
的 优先级高于operator*
; 那么*score_ptr++
等价于*(score_ptr++)
。 请注意, 后缀operator++
将递增操作数并返回原始值,然后*(score_ptr++)
将给出值1
。
结果是操作数原始值的纯右值副本。
另一方面,前缀operator++
返回递增的值。 如果您将代码更改为*++score_ptr
(相当于*(++score_ptr)
),那么结果将是2
(这可能是您所期望的)。
递增先发生,优先级更高,相当于*(score_ptr++)
,但它是后自增,这意味着它只会在使用取消引用的指针之后发生,即表达式达到;
.
如果你使用
std::cout << *++score_ptr;
然后你有一个预增量,这里它会提前发生,指针将在使用值之前递增,并且 output 将为2
。 等效于*(++score_ptr)
。
请注意,使用括号总是一个好主意,它将使代码更清晰,并避免误解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.