通过引用调用与通过指针参数调用进行前后递增的区别
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
上调用。
我知道如何通过引用调用和通过指针操作调用。但是我对在 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
上调用。