C ++递增指针

时间:2016-08-29 16:29:42

标签: c++ pointers post-increment pre-increment

为什么我可以执行类似* 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;
}

3 个答案:

答案 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);