首页 > 解决方案 > 通过引用调用与通过指针参数调用 todo pre 和 postincrement 的区别

问题描述

我知道如何通过引用调用和通过指针操作调用。但我对在增量操作前和增量后同时执行这两种操作感到困惑。这里是代码片段。

使用指针参数通过引用调用

void fun2(int *x) // It works like int *x=&x;
{
    ++*x;  // *x++ does not provide lvalue, so will not work here [ I think So ]
}

使用引用参数通过引用调用

void fun3(int& x)
{
    ++x;  // x++; [both works fine but I can't understand why?]
}

这是驱动程序代码

int main()
{
    int x=10;
    cout<<x<<"\n"; //10
    fun2(&x);
    cout<<x<<"\n"; //11
    fun3(x);
    cout<<x<<"\n"; //12
    return 0;
}

为什么在 fun2() *x++ 中输出 10 而不是 11 但 ++*x 工作正常,而在 fun3() 中 x++ 和 ++x 工作正常?

标签: c++pass-by-referencepost-incrementpre-incrementpass-by-pointer

解决方案


fun2(),*x++不做你认为它做的事。

根据运算符优先级++ 后缀递增运算符的优先级高于*取消引用运算符。因此,该语句*x++被视为*(x++),在取消引用之前递增指针。指向的值是未触及的。

对于您所期望的,您需要改为使用(*x)++,取消引用指针,然后递增指向的值。

您没有相同的问题, ++*x因为++ 前缀增量*运算符与取消引用运算符具有相同的优先级,但首先被评估,因此++*x被视为++(*x).

func3()中,没有指向取消引用的指针。x是对调用者int( xin main()) 的引用,因此两个增量运算符都被直接调用int


推荐阅读