示例代码
int arr[3] = { 0, 1 };
int* buf = arr;
*buf++ = *buf + 10;
最后一个表达式的结果是buf[0] == 10
。我教过它是buf[0] == 11
。
我的一所大学写了一些类似于示例代码的东西,我教它的工作方式不同于它。而且我想知道它为什么会这样运作。
我想弄清楚的方法是查看运算符优先级表。在那里它指出后缀++优先于解除引用。因此,我教导在operator=
buf
的左侧将指向第一个元素,但在operator=
的右侧,它将已经增加并指向第二个元素。然而事实并非如此。
我的问题是,为什么会这样?最好是标准报价:)但欢迎任何解释!
答案 0 :(得分:2)
您在单个序列点中多次访问和修改指针。这是未定义的行为。
更一般地说,未定义在序列点之间读取和写入任何变量。在这个具体示例中有一个指针的事实是旁边的。
为避免与指针混淆:
int i = 0;
i++ = i + 1; // UB
逻辑上,右侧的i
应该是i
的“当前”值还是修改后的值?这就是它未定义的原因。相反,将代码分开:
int i = 0;
++i;
i = i + 1;
这是明确的,并且定义明确。