请解释此代码正确或不正确的原因: 在我看来,行++*p1 = *p2++ 具有未定义的行为,因为 p1 首先被取消引用然后递增。
int main()
{
char a[] = "Hello";
char b[] = "World";
char* p1 = a;
char* p2 = b;
//*++p1 = *p2++; // is this OK?
++*p1 = *p2++; // is this OK? Or this is UB?
std::cout << a << "\n" << b;
return 0;
}
最佳答案
第一个没问题
*++p1 = *p2++ // p1++; *p1 = *p2; p2++;
第二个是 C++ 的 UB,因为您正在修改 p1
指向的内容两次(一次是因为递增,一次是因为赋值),并且没有序列点分隔这两个副作用。
对于 C++0x 规则,事情有所不同,解释和理解起来也更加复杂。如果你故意编写像第二个那样的表达式,如果它不是为了代码高尔夫比赛,如果你是在为我工作,那么就认为你自己被解雇了(即使这在 C++0x 中是合法的)。
我不知道它在 C++0x 中是否合法,我也不想知道。我的神经元太少,不能这样浪费它们。
关于c++ - 这是未定义的行为吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8848364/