我正在C++中迈出第一步,在Java中拥有良好的背景。我需要清除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)

10-06 13:53