C++ 递增指针

C++ Incrementing a Pointer

为什么我可以做*x = *x+1;,但做*x = *x++;好像没什么影响?

代码:

// Example program
#include <iostream>
#include <string>

using namespace std;

void doSomething(int *x, int *y)
{
    *x = *x++;
    *y = *y + 5;
}

int main()
{
    int x = 4;
    int y = 3;
    doSomething(&x, &y);
    cout << "x is now: " << x << endl; //outputs 4
    cout << "y is now: " << y << endl; //outputs 8
    return 0;
}

此声明

*x = *x+1;

可以这样写

*x = ++*x;

当然可以只写

++*x;

至于这个说法

*x = *x++;

那么就相当于

*x = *( x++ );

并且具有未定义的行为,因为 post 增量运算符的副作用未排序。

后缀运算符 ++ 的优先级高于 dereference * 运算符。语句*x = *x++;执行如下*x = (*(x++))

正如您所见,首先执行 ++ 运算符,使指针指向它指向的位置。从那里开始执行 dereference 运算符。如果你想增加 x 的实际值,只需写 ++*x;

因为所有表达式都遵循operators precedence rule.

正如您在 table 中看到的那样,运算符 operator++ 的优先级高于 operator*

后面加括号更好,代码:

*x = *x++;

相当于:

*x = *(x++);

简而言之,您正在递增指针的值,取消引用它之后。

在记忆中它会发生这样的事情:

|  x = 4   |     <---- &x
|  trash   |
|  trash   |

您递增指针,它将指向内存中的下一个单元格:

|  x = 4   |     
|  trash   |     <---- &x+1
|  trash   |

并且with给自己赋值,反正就是垃圾


解决方案

为了避免误解,括号的用法应该是一个有效的帮助。

修复:

*x = ++(*x);