&++x 和 &x++ 的区别
Difference between &++x and &x++
虽然这个问题可能在某个地方有答案,但我找不到。
下面写的第一个语句有效而第二个不?为什么?
int main() {
int x = 1, y = 2;
int *p = &++x; // First
std::cout << "*p = " << *p << std::endl;
// int *q = &x++; // Second
// std::cout << "*q = " << *p << std::endl;
}
在此声明中
int *p = &++x;
使用了两个一元运算符:预增++和取地址。一元运算符从右到左执行。所以首先变量x
自增,其地址赋值给指针p,预自增运算的结果是自增对象的lvalue
。
例如这样的表达式
++++x;
正确。
在此声明中
int *p = &x++;
使用了post固定运算符post-自增++和取地址的一元运算符。相对于一元运算符,后缀运算符具有更高的优先级。所以首先执行 post-increment。它的结果是一个临时对象,它在递增之前具有变量 x 的值。然后执行取地址运算符
但是您不能获取临时对象的地址。所以对于这个声明,编译器会报错。
与预自增运算符相反,这样的表达式
x++++;
无效。
来自 C++ 17 标准(5.3.2 递增和递减)
1 The operand of prefix ++ is modified by adding 1, or set to true if
it is bool (this use is deprecated). The operand shall be a modifiable
lvalue. The type of the operand shall be an arithmetic type or a
pointer to a completely-defined object type. The result is the
updated operand; it is an lvalue, and it is a bit-field if the
operand is a bit-field....
与(5.2.6自增自减)
1 The value of a postfix ++ expression is the value of its operand. [
Note: the value obtained is a copy of the original value — end note
]...
在 C 中,这两个操作都会产生一个值。所以在 C 中你也可能不会写
++++x;
虽然这个问题可能在某个地方有答案,但我找不到。
下面写的第一个语句有效而第二个不?为什么?
int main() {
int x = 1, y = 2;
int *p = &++x; // First
std::cout << "*p = " << *p << std::endl;
// int *q = &x++; // Second
// std::cout << "*q = " << *p << std::endl;
}
在此声明中
int *p = &++x;
使用了两个一元运算符:预增++和取地址。一元运算符从右到左执行。所以首先变量x
自增,其地址赋值给指针p,预自增运算的结果是自增对象的lvalue
。
例如这样的表达式
++++x;
正确。
在此声明中
int *p = &x++;
使用了post固定运算符post-自增++和取地址的一元运算符。相对于一元运算符,后缀运算符具有更高的优先级。所以首先执行 post-increment。它的结果是一个临时对象,它在递增之前具有变量 x 的值。然后执行取地址运算符
但是您不能获取临时对象的地址。所以对于这个声明,编译器会报错。
与预自增运算符相反,这样的表达式
x++++;
无效。
来自 C++ 17 标准(5.3.2 递增和递减)
1 The operand of prefix ++ is modified by adding 1, or set to true if it is bool (this use is deprecated). The operand shall be a modifiable lvalue. The type of the operand shall be an arithmetic type or a pointer to a completely-defined object type. The result is the updated operand; it is an lvalue, and it is a bit-field if the operand is a bit-field....
与(5.2.6自增自减)
1 The value of a postfix ++ expression is the value of its operand. [ Note: the value obtained is a copy of the original value — end note ]...
在 C 中,这两个操作都会产生一个值。所以在 C 中你也可能不会写
++++x;