C++的意外输出

unexpected output of C++

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

此处指针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";
}

Output:

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是在已经对变量应用side effect的情况下输出的i