c++ - 通过引用调用与通过指针参数调用 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 工作正常?
解决方案
在fun2()
,*x++
不做你认为它做的事。
根据运算符优先级,++
后缀递增运算符的优先级高于*
取消引用运算符。因此,该语句*x++
被视为*(x++)
,在取消引用之前递增指针。指向的值是未触及的。
对于您所期望的,您需要改为使用(*x)++
,取消引用指针,然后递增指向的值。
您没有相同的问题,
++*x
因为++
前缀增量*
运算符与取消引用运算符具有相同的优先级,但首先被评估,因此++*x
被视为++(*x)
.
在func3()
中,没有指向取消引用的指针。x
是对调用者int
( x
in main()
) 的引用,因此两个增量运算符都被直接调用int
。