示例代码
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;
这是明确的,并且定义明确。