首页 > 解决方案 > Difference between &++x and &x++

问题描述

Although this question might be answered somewhere and I could not find it.

Below written first statement work whereas second does not? WHY?

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;
}

标签: c++post-incrementpre-incrementunary-operatorpostfix-operator

解决方案


在这份声明中

int *p = &++x;

使用了两个一元运算符:预增 ++ 和取地址。一元运算符从右到左执行。因此,首先变量x递增并将其地址分配给指针 p,预递增运算符的结果是lvalue递增对象的结果。

例如,像这样的表达式

++++x;

是正确的。

在这份声明中

int *p = &x++;

有使用后缀运算符post-increment ++和取地址的一元运算符。后缀运算符相对于一元运算符具有更高的优先级。所以首先执行后增量。它的结果是一个临时对象,它在递增之前具有变量 x 的值。然后执行取址算子。

但是,您可能不会获取临时对象的地址。所以对于这个声明,编译器会发出一个错误。

与预增量运算符相反,这样的表达式

x++++;

是无效的。

来自 C++ 17 标准(5.3.2 增量和减量)

1 前缀 ++ 的操作数通过加 1 进行修改,如果为 bool,则设置为 true(不推荐使用此用法)。操作数应为可修改的左值。操作数的类型应为算术类型或指向完全定义的对象类型的指针。结果是更新的操作数;它是一个左值,如果操作数是一个位域,它就是一个位域....

和(5.2.6 递增和递减)

1后缀 ++ 表达式的值是其操作数的值。[注:获得的值是原始值的副本-结束注]...

在 C 中,这两个操作都会产生一个值。所以在C中你也可能不会写

++++x;

推荐阅读