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
在下一句中是在副作用已经应用于变量时输出的。
相关文章:
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 字符串比较中的意外输出
- 每次在 c++ 中输出不同(意外行为)
- 来自 decltype 的意外输出类型
- 字符数组到十六进制字符串的转换 - 意外输出
- 使用 boost::regex 从目录中获取带有一些正则表达式的文件名称时出现意外输出
- 使用后序遍历递归的深度优先搜索会产生意外输出
- C++的意外输出
- 标准输出C++意外行为
- 贝金纳C++练习解决方案的意外输出
- 无效* 转换获得意外输出
- 以下程序的意外输出
- 意外输出:矢量矢量(功率集)
- 基本 int 数组提供意外输出
- 线程的意外输出
- 减法中的意外输出
- 带有左移操作员C 的意外输出
- C strncpy意外输出
- 意外输出..函数绑定在虚拟表中的发生方式
- 星号的意外输出