2016-10-31 81 views
-4

我有这样的代码:编译器返回未初始化值

#include <iostream> 

using namespace std; 


void funcA() 
{ 
    int a = 4; 
} 

void funcB() 
{ 
    int b; 
    cout << b; 
} 

int main() 
{ 
    funcA(); 
    funcB(); 

    cout << endl; 

    return 0; 
} 

如果我编译它没有优化:g++ -o run file.cpp我收到的结果:g++ -O3 -o run file.cpp我收到的结果是:4

如果我与编译:现在0

,我希望在这两种情况下

1)返回从FuncA的什么,因为我们只是调用它,在乐趣cA我们只是给一个变量赋值(不返回任何东西)。

2)由于我们没有初始化b值,所以从编译器返回一个关于funcB的警告。

我发现this answer更好(更详细)。

+3

这是未定义的行为。你得到的是你得到的,因为未定义的理由 – NathanOliver

+4

好吧,未定义的行为是未定义的,因此争论是没有用的。如果您需要警告,请启用警告。 –

+2

*现在,我预计在这两种情况下...... * - 不,未定义的行为不会以您希望发生的事情发生的方式发挥作用。 – PaulMcKenzie

回答

3

要获得有用的警告,你必须要求他们。运行gcc与-Wall -Wextra选项,并感到惊讶。

+0

好的,谢谢!我看到了! – George

1

在C++中,如果不初始化值,编译器(不带警告标志)不会警告您。

如果你初始化一个变量,你实际上做的是分配x字节的数据(在这种情况下最可能是4)。所以即使你没有初始化它,也有'某些'。

在这种情况下,它可能会重复使用先前由a拍摄的大块内存,这就是为什么您在输出中看到4个。

如果你用-03标志运行g ++(最大优化),所有的值都被初始化为0.这就是为什么你在输出中看到0的原因。

+1

*“如果你运行带有-03标志(最大优化)的g ++,所有的值都被初始化为0.这就是为什么你在输出中看到0的原因。”*这是不正确的。 –

+0

是的,你是对的,g ++没有标志将单位值设置为0. – SlowerPhoton

+1

由于优化设置得很高,编译器可能不会为funcA发出代码,因为没有可执行语句,并且看到funcA没有任何作用,编译器或链接器可能会消除它。 –