*buf++ = *buf + 10 - Explanation

*buf++ = *buf + 10 - Explanation

本文关键字:Explanation buf buf++      更新时间:2023-10-16

示例代码

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

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

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

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

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

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

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

为避免与指针混淆,请执行以下操作:

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

从逻辑上讲,右侧的i应该是i的"当前"值,还是修改后的值? 这就是为什么它是未定义的。 相反,请分隔代码:

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

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