在C ++中,如果我打印一个尚未赋值的变量会怎样?以下两个代码给出了两个不同的结果。此外,第一个在每个编辑中给出不同的结果,第二个每次打印0。为什么呢?
int main() {
int x = 1;
int y; // No value has been assigned
if (x) {
cout << y; // without using endl
// prints different value each time
}
}
VS
int main() {
int x = 1;
int y; // y is not initialized
if (x) {
cout << y << endl; // using endl
// prints 0
}
}
答案 0 :(得分:5)
读取未初始化的值(更具体地说,对不确定的值执行左值到右值的转换,这是由于未初始化对象而产生的)未定义的行为;换句话说,这两个程序都是错误的。
答案 1 :(得分:0)
这些变量保存在调用堆栈中,这意味着在程序启动时会分配内存。程序只知道从堆栈中读取变量的位置。程序读取的范围只是通过调用例程而不是归零来改变,并且在启动程序或之前使用时可能不会重置。编译器的某些优化可能会在调用真正的主程序之前加载或初始化某些东西,这与endl有关。
只需在构造函数中创建一个带有输出的类,并在全局范围内初始化它的变量。调试它,在构造函数中放置一个断点,你就不会看到调用堆栈上的主程序。