编译器返回未初始化的值

时间:2016-10-31 19:14:15

标签: c++ compiler-optimization

我有这段代码:

#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我收到的结果是:4

如果我用以下代码编译它:g++ -O3 -o run file.cpp我收到的结果是:0

现在,我希望在两种情况下

1)从funcA返回任何内容,因为我们只是调用它而在funcA中我们只是为变量赋值(不要返回任何内容)。

2)从编译器返回关于funcB的警告,因为我们没有初始化b值。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

在这种情况下,它可能会重用a先前占用的内存块,这就是输出中看到4的原因。

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