通过引用调用与通过指针参数调用进行前后递增的区别

Difference in Call by Reference Vs Call by pointer argument todo pre and postincrement

我知道如何通过引用调用和通过指针操作调用。但是我对在 pre 和 post-increment 操作中同时执行这两个操作感到困惑。这里是代码片段。

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

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 工作正常?

fun2() 中,*x++ 与您认为的不同。

Per operator precedence++ postfix increment 运算符的优先级高于 * 取消引用运算符。因此,语句 *x++ 被视为 *(x++),在取消引用之前递增指针。指向的值未被触及。

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

你没有同样的问题 ++*x 因为 ++ prefix increment 运算符与 * 解引用运算符具有相同的优先级但首先被计算,所以 ++*x 是视为 ++(*x).

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