c++ - 这是未定义的行为吗?为什么?

标签 c++

请解释此代码正确或不正确的原因: 在我看来,行++*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/

相关文章:

c++ - 你如何在 C++ 中将 UINT8 转换为 UINT32?

c++ - 共享首选项实现

c++ - C++中奇怪的析构函数调用

c++ - 如何对 float 数组使用基数排序?

c++ - 读取和写入许多文本文件

c++ - 类名变量(arg1)之间的区别;和 ClassName 变量 = ClassName (arg1);

c++ - 无法理解 C++ 中列表的实现

c++ - 在 C++ 中找到数字除数的最快方法

c++ - 我怎样才能让 Doxygen 知道 CUDA 内核调用?

c++ - 声明中类型和对象的相同标识符