c++ - 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;
}
解决方案
在这份声明中
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;
推荐阅读
- c++ - c++ opencv矩阵逆乘另一个矩阵
- json - 在 Laravel 控制器中以 JSON 格式发送数据时附加一个字符串
- java - 休息的标签可以有任何名称吗?
- excel - 宏创建 Excel 表到 powerpoint
- typescript - typescript函数默认参数分配和类型检查有什么区别?
- c++ - C ++在不同函数中重新分配指向动态内存中数组的指针
- python - 在 django 中多态序列化对象
- mysql - 使用哪种排序规则以便将 `ş` 和 `s` 视为唯一值?
- r - h2o categorical_encoding 了解何时使用以及为什么
- python - 使用列表值作为后续键访问字典值