【问题标题】:Difference between &++x and &x++&++x 和 &x++ 的区别
【发布时间】:2020-07-21 07:41:34
【问题描述】:

虽然这个问题可能在某处得到解答,但我找不到。

下面写的第一条语句有效,而第二条则没有?为什么?

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

【问题讨论】:

  • &amp;x++ 甚至不会编译。通俗地说,它返回一个临时的。

标签: c++ post-increment pre-increment unary-operator postfix-operator


【解决方案1】:

在此声明中

int *p = &++x;

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

例如这样的表达式

++++x;

是正确的。

在此声明中

int *p = &x++;

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

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

与前自增运算符相反,这样的表达式

x++++;

无效。

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

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

和(5.2.6 递增和递减)

1 后缀++表达式的值是其操作数的值。 [ 注:得到的值是原值的副本——尾注 ]...

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

++++x;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多