为什么我可以执行类似* 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;
}
答案 0 :(得分:2)
本声明
*x = *x+1;
可以写成
*x = ++*x;
当然你可以写
++*x;
至于这句话
*x = *x++;
然后它相当于
*x = *( x++ );
并且具有未定义的行为,因为后增量运算符的副作用未按顺序排列。
答案 1 :(得分:2)
后缀运算符++
的优先级高于dereference *
运算符。语句*x = *x++;
执行如下*x = (*(x++))
正如您所见,首先执行++
运算符,使指针指向它所指向的位置。从那里开始执行dereference
运算符。如果您想增加x
的实际值,只需写++*x;
答案 2 :(得分:-1)
因为所有表达式都遵循operators precedence rule。
正如您在表格中看到的,运算符operator++
的优先级高于operator*
您可以更好地使用括号,代码:
*x = *x++;
相当于:
*x = *(x++);
简而言之,您需要在取消引用后递增指针的值和。
在记忆中,它发生的事情如下:
| x = 4 | <---- &x
| trash |
| trash |
增加指针将指向内存中的下一个单元格:
| x = 4 |
| trash | <---- &x+1
| trash |
并将其价值分配给自己,无论如何它都是垃圾。
为避免错误理解,括号的使用应该是有效的帮助。
修复:
*x = ++(*x);