C++中未初始化变量的值
Value of a non-initialized variable in C++
这很简单,但我无法解释。我声明了 4 个变量,并用 C++ 打印出来:
#include <iostream>
using namespace std;
int main(){
int a, b, c, d;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
cout << "d = " << d << endl;
return 0;
}
结果是:
a = 0
b = 1
c = 0
d = 0
我想如果我不初始化变量的值,程序将从内存中获取一些随机值。或者至少它都等于零。我不知道这些价值观的差异从何而来。
这不是因为特定的变量b
,如果我切换那些"cout <<"行,第二行总是给出值 = 1。
谁能为我解释一下,请。非常感谢。
读取未初始化的变量是C++中的未定义行为。
编译器可以自由地为您的程序生成它喜欢的任何代码,因为您违反了语言的规则。
你的程序可能会崩溃,完全按照你的期望,永远运行或做任何其他你能想象的事情。
现在,编译器的合理实现不会以UB为借口来格式化您的硬盘驱动器(但它们可以(,但是UB仍然意味着您的程序根据标准没有意义,并且您可以并且将获得跨编译器和操作系统的任意结果。不要指望你现在看到的结果,使用你当前的编译器,在你当前的操作系统上,在不同的情况下,在不同的编译器或不同的操作系统上,当涉及UB时,结果是相同的。
简而言之;您有责任不调用 UB。编译器不需要警告您。如果你想要一个具有确定性行为的程序,你不需要调用UB。
相关文章:
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 不稳定的C :每行适应性变化多变量初始化
- 同一函数中的静态函数变量初始化顺序
- C 语言中的静态变量初始化
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 类POD成员变量初始化
- 尝试捕获类变量初始化的范围
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 多变量初始化编译器支持