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";
}
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
。
我发现以下程序的意外输出。
此处指针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
是在已经对变量应用side effect的情况下输出的i
。