C++的意外输出

unexpected output of C++

本文关键字:输出 意外 C++      更新时间:2023-10-16

我发现以下程序的意外输出。

这里,指针ptr指向变量i的地址,并且i保持值10。意味着ptr的值也是10的值。下一个ptr递增一次。这意味着现在它保持值11。但是在下面的程序中ptr打印12

#include <iostream>
using namespace std;    
int main()
{
int i = 10;
int *ptr = &i;
int j = 2;
j += *ptr++;
cout<<"i : "<<i<<"n";
cout<<"j : "<<j<<"n";
cout<<"ptr : "<<*ptr<<"n";
}

输出:

i : 10
j : 12
ptr : 12

所以我不明白为什么ptr打印12而不是11

程序具有未定义的行为。

此声明

j += *ptr++;

相当于

j += *( ptr++ );

所以指针现在指向变量i之后,也就是说它没有指向有效的对象。

因此,

cout<<"ptr : "<<*ptr<<"n";

调用未定义的行为。

编译器将变量j放在变量i之后。然而,C++标准未指定变量的顺序。

例如,gcc编译器的输出与您所展示的相同。

i : 10
j : 12
ptr : 12

而clang编译器的输出是

i : 10
j : 12
ptr : 4201824

你的意思是以下

j += ( *ptr )++;

在这种情况下,输出将是

i : 11
j : 12
ptr : 11

注意,i的输出值是11,因为变量i在下一句中是在副作用已经应用于变量时输出的。