为什么((cout<;<;ptr;cout<;<;\n<;<;&x2B&x2B;ptr;)和((cout<;<;ptr<;\n<;&x2B&ptr;)会给出不同的结果 我是C++的新手,最近我花了几天时间阅读指针。我意识到下面的2个代码给了我不同的结果,尽管它们看起来是一样的。

为什么((cout<;<;ptr;cout<;<;\n<;<;&x2B&x2B;ptr;)和((cout<;<;ptr<;\n<;&x2B&ptr;)会给出不同的结果 我是C++的新手,最近我花了几天时间阅读指针。我意识到下面的2个代码给了我不同的结果,尽管它们看起来是一样的。,c++,pointers,cout,C++,Pointers,Cout,第一个代码: int a = 5; int* ptr = &a; cout << ptr; cout << "\n" << ++ptr; inta=5; int*ptr=&a; 仔细看:cout让我们把now命名为函数f(a,b)。 使用这种表示法,cout第二个代码段具有未定义的行为,因为函数参数的求值顺序未指定。”但在第二个代码段中,ptr显然总是指向a。“您是如何确定的?您是否更可能只输出了两次递增的值?正如@vladfrommosco指出的,

第一个代码:

int a = 5;
int* ptr = &a;
cout << ptr;
cout << "\n" << ++ptr;
inta=5;
int*ptr=&a;

仔细看:
cout让我们把now命名为函数
f(a,b)

使用这种表示法,
cout第二个代码段具有未定义的行为,因为函数参数的求值顺序未指定。”但在第二个代码段中,ptr显然总是指向a。“您是如何确定的?您是否更可能只输出了两次递增的值?正如@vladfrommosco指出的,顺序是未定义的。因此,
++ptr
首先得到计算值,然后再次得到具有相同值的
ptr
。它们可能不会指向
a
,而是指向下一个位置。您可以使用
cout@VladfromMoscow:不再在C++17中验证这一点(OP不使用),请参见重新打开。所谓的副本与这个问题无关。请注意,C++17对
E1强制执行评估顺序请注意,C++17对
E1强制执行评估顺序
int a = 5;
int* ptr = &a;
cout << ptr << "\n" << ++ptr;
cout << ptr << "\n" << ++ptr;
f(f(f(cout, ptr), "\n"), ++ptr);