[英]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.