&++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;