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);
为什么我可以做*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);