用增量运算符按引用传递

时间:2018-07-10 16:38:10

标签: c++ pass-by-reference pre-increment

大家好,我在学习用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,这也是我在前一种情况下的期望。

3 个答案:

答案 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;
 }