* buf ++ = * buf + 10 - 解释

时间:2014-02-21 19:07:21

标签: c++ operators

示例代码

int arr[3] = { 0, 1 };
int* buf = arr;
*buf++ = *buf + 10;

最后一个表达式的结果是buf[0] == 10。我教过它是buf[0] == 11

我的一所大学写了一些类似于示例代码的东西,我教它的工作方式不同于它。而且我想知道它为什么会这样运作。

我想弄清楚的方法是查看运算符优先级表。在那里它指出后缀++优先于解除引用。因此,我教导在operator= buf的左侧将指向第一个元素,但在operator=的右侧,它将已经增加并指向第二个元素。然而事实并非如此。

我的问题是,为什么会这样?最好是标准报价:)但欢迎任何解释!

1 个答案:

答案 0 :(得分:2)

您在单个序列点中多次访问和修改指针。这是未定义的行为。

更一般地说,未定义在序列点之间读取和写入任何变量。在这个具体示例中有一个指针的事实是旁边的。

为避免与指针混淆:

int i = 0;
i++ = i + 1; // UB

逻辑上,右侧的i应该是i的“当前”值还是修改后的值?这就是它未定义的原因。相反,将代码分开:

int i = 0;
++i;
i = i + 1;

这是明确的,并且定义明确。