这是我们以前的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:“在前一个序列点和下一个序列点之间,标量对象的存储值最多只能通过表达式的求值修改一次。”