繁体   English   中英

&++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,预递增运算符的结果是递增的 object 的lvalue

例如,像这样的表达式

++++x;

是正确的。

在这份声明中

int *p = &x++;

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

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

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

x++++;

是无效的。

从 C++ 17 标准(5.3.2 递增和递减)

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

和(5.2.6 递增和递减)

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

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

++++x;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM