[英]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.