C++ operator++ 和指针

标签 c++ pointers

我在 Java 方面有很好的背景,正在迈出 C++ 的第一步。我需要清除 C++ 中++ 运算符的一些特性。考虑以下程序:

#include <iostream>
using namespace std;
void __print(int x, int *px) {
 cout << "(x, *px) = (" << x << ", " << *px << ")" << endl;
}

int main() {
 int x = 99;
 int *px = &x;
 __print(x, px);
 x++; __print(x, px);
 x = x + 1; __print(x, px);
 *px = *px + 1; __print(x, px);
 *px++; __print(x, px);
 return 0;
}

令我惊讶的是,该程序打印出:

(x, *px) = (99, 99)
(x, *px) = (100, 100)
(x, *px) = (101, 101)
(x, *px) = (102, 102)
(x, *px) = (102, 134514848)

似乎 *px = *px + 1 对 *px 的影响与对 x 的影响不同。但是这些东西不一样吗???不是*px == x吗?

最佳答案

* 运算符在 ++ 之后工作,因此它返回错误地址的值。在 C++ 中,运算符优先级很重要。看看这个:

http://en.cppreference.com/w/cpp/language/operator_precedence

添加括号可以改变运算符的优先级,例如:

#include <iostream>
using namespace std;
void __print(int x, int *px) {
 cout << "(x, *px) = (" << x << ", " << *px << ")" << endl;
}

int main() {
 int x = 99;
 int *px = &x;
 __print(x, px);
 x++; __print(x, px);
 x = x + 1; __print(x, px);
 *px = *px + 1; __print(x, px);
 (*px)++; __print(x, px);
 return 0;
}

结果:

(x, *px) = (99, 99)
(x, *px) = (100, 100)
(x, *px) = (101, 101)
(x, *px) = (102, 102)
(x, *px) = (103, 103)

关于C++ operator++ 和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9800760/

相关文章:

c++ - C++中数组的动态调整大小

c++ - 使用 C++ 在 Windows 中更新 PATH 环境变量

c++ - 是否可以从宏定义宏

c - 指向地址 C 的字符串

c++ - 指向抽象类的指针数组

c - 指针作为函数返回和 malloc 的使用

c - Memcpy 到 malloced 结构内的数组中

c++ - Visual Studio C++ 控制台应用程序生成并运行但不创建 EXE 文件

c++ - std::string::clear 是否回收与字符串关联的内存?

c++ - OpenCL C++ 绑定(bind):WAITING单个 cl::Event?