3

我对这种行为有点困惑。谁能解释

  void Decrement(int* x){
        *x--; //using this line, the output is 5 

        //*x=*x-1; //using this l ine, the output is 4

    }

    int main(){
        int myInt=5;
        Decrement(&myInt);
        cout<<myInt<<endl;
        return 0;
    }

    Output: 5
4

6 回答 6

8

*x--意味着*(x--)。也就是说,您的程序修改x,而不是它指向的内容。由于它是按值传递的,因此该修改在main(). 要匹配您的注释行,您需要使用(*x)--.

于 2013-01-25T06:15:27.613 回答
3

试试(*x)--;

您的代码正在递减指针,然后取消引用并丢弃该值。

于 2013-01-25T06:16:28.823 回答
2

这是一个运算符优先级问题。

--运算符优先于取消引用运算符 ( *)。因此,您实际上所做的只是访问 x 位置下方一个内存位置的值(并且什么都不做)。

我觉得你可能想要做的是通过 x “通过引用”。看起来像这样:

void Decrement(int& x){
    x--;
}

int main(){
    int myInt = 5;
    Decrement(myInt);
    cout << myInt << endl;
    return 0;
}

当您通过引用传递值时,C++ 会自动为您取消引用指针,这就是*Decrement 函数中不再需要 的原因。

于 2013-01-25T06:17:54.423 回答
2

你期待 (*x)-- 并且得到 *(x--)。原因是操作的优先级。查一下。“取消引用地址”之前的前后增量绑定。

于 2013-01-25T06:19:20.070 回答
2

您基本上是x按值传递指针。因此,函数中的哪些更改x(而不是它指向的内容)void Decrement(int*)不会反映在main(). 此代码将实现您打算做的事情:

void Decrement(int& x)
    {
        x--;

    }

int main()
    {
        int myInt=5;
        Decrement(myInt);
        cout<<myInt<<endl;
        return 0;
    }

    Output: 4

这是通过引用调用,通过它传递对变量的引用(或地址)。

于 2013-01-25T06:34:55.137 回答
1

表达式*x--等价于*(x--)

于 2013-01-25T06:16:05.063 回答