大家好,我在学习用c ++编写代码时有一个非常基本的问题。
我正在阅读按引用传递和按值传递之间的差异。我写了一个简单的代码来测试它,但是它做了我没想到的事情。
#include <iostream>
using namespace std;
void MyIncr (float *x);
int main() {
float score = 10.0;
cout << "Orignal Value = " << score << endl;
MyIncr(&score);
cout << "New Value = " << score << endl;
}
void MyIncr (float *x) {
*++x;
}
我为什么两支球都得到10?但是,如果我将功能更改为:
void MyIncr (float *x) {
*x += 1;
}
对于旧值,我得到10,对于新值,我得到11,这也是我在前一种情况下的期望。
答案 0 :(得分:5)
void MyIncr (float *x) {
*++x;
}
在这种情况下是未定义的行为。您首先要增加指针,然后再取消引用它。当指针增加时,它不再指向有效的float
对象。因此,取消引用是未定义的行为。
在调用方,指针或指针所指向的对象的值没有任何反应。要增加指针指向的对象的值,请使用++(*x)
。
void MyIncr (float *x) {
++(*x);
}
最好通过引用传递对象。将会减少混乱。
void MyIncr (float& x) {
++x;
}
答案 1 :(得分:1)
问题在这里:
phonegap plugin add cordova-plugin-whitelist
phonegap prepare
如果您检出C++ Operator Precedence,则会看到前缀*++x;
运算符的优先级与解引用++
运算符的优先级相同,因此从右到左进行评估。这意味着上面的代码行首先递增指针(因为*
是最右边的运算符),然后尝试取消引用它。如果您希望保留++
运算符,则可以切换运算符的顺序。
++
我认为使用方括号会更具可读性。
++*x;
答案 2 :(得分:1)
添加到R sahu的答案中。这是由于运算符的优先级及其相关性而引起的。
void MyIncr (float *x) {
*++x;
}
Pre-increment(++)和dereference或indirection(*)运算符具有相同的优先级,并且是从右到左关联的,因此无论哪个在右边都将首先执行,因此在您的情况下,指向的指针x将先递增,然后再解除引用。因此要获得11,请执行以下操作:
void MyIncr (float *x) {
++*x;//even without the parenthesis this will work
}
再次通过引用是解决问题的最佳方法。调用MyIncr(x)
这样的函数,该函数应如下所示
void MyIncr (float& x) {
++x;
}