这是我们以前的C++考试中的一个问题。这段代码使我发疯,任何人都无法解释它的作用-尤其是-为什么?

int arr[3]={10,20,30};
int *arrp = new int;

(*(arr+1)+=3)+=5;
(arrp=&arr[0])++;

std::cout<<*arrp;

最佳答案

该语句两次写入对象*(arr+1)而不插入中间的序列点,因此具有未定义的行为。

(*(arr+1)+=3)+=5;

该语句两次写入对象arrp而不插入中间的序列点,因此具有未定义的行为。
(arrp=&arr[0])++;

该代码可能导致任何事情发生。

引用:ISO/IEC 14882:2003 5 [expr]/4:“在前一个序列点和下一个序列点之间,标量对象的存储值最多只能通过表达式的求值修改一次。”

10-07 20:22