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
(这可能是您所期望的)。
这段代码:
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
(这可能是您所期望的)。