2017-08-08 155 views
2

这很简单,但我无法解释它。我宣布4个变量,并打印出来在C++: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

谁能解释这对我来说,请。非常感谢。

+4

尚未初始化的变量的值在C++中是未定义的 – litelite

+0

我想这些未定义的变量是随机值,尝试显示它们是UB。 –

+2

打开编译器警告以使用未初始化的变量。它会帮助你编写实际工作的代码。 – tadman

回答

3

读取未初始化的变量是C++中的未定义行为。

编译器可以自由生成任何代码它喜欢你的程序,因为你打破了语言的规则。

您的程序可能会崩溃,完全按照您的期望执行,永远运行或执行任何您可以想象的事情。

现在编译器将不使用UB为借口,格式化你的硬盘的合理实现(但他们),但仍UB意味着你的程序有根据该标准,并且没有任何意义,你可以和将在编译器和操作系统中获得任意结果。当涉及UB时,不要期望现在使用当前编译器在当前操作系统上看到的结果在使用不同编译器或不同操作系统的不同情况下是相同的。

简而言之,它的你的责任不援引UB。编译器是而不是需要警告你。如果你想要一个具有确定性行为的程序,你不需要调用UB。

+0

我得到一个不应该读取未初始化的变量。我的问题是,如果我让这行'cout <<“c =”<< c << endl;'而不是打印b,我会有c = 1。这是关于我还没有得到的订单。 – Huyen

+0

@NguyễnNgọcHuyền当你的程序包含UB时,你不能推理你的程序。您看到的任何结果/效果都是任意的,而不是*确定性的。停止尝试推理你目前观察到的内容,而不是*修复* UB - *然后*你可以开始尝试并推理你的程序行为。顺便说一句'cout <<“c =”<< c' *是*读取一个未初始化的变量 - > UB。 –

+0

@NguyễnNgọcHuyền - 什么是“苛刻”?我只是想陈述*事实* - 清楚而简单。 –