海湾合作委员会没有抱怨未初始化的变量

时间:2016-05-25 09:18:33

标签: c gcc gcc-warning

为什么gcc不抱怨j未初始化?如果我删除了j + = 10,它实际上会抱怨...用-Wall编译(用gcc 4.9和5.3测试)。

int main(void)
{
    int i;
    int j;
    int threshold = 100;

    for (i = 0 ; i < 100 ; i++)
    {
        if (j >= threshold)
            break;
        j += 10; /* comment this line to enable uninitialized variable warning */
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您可能会在高优化级别对其进行编译,这会导致为了优化目的而删除循环。

请尝试在-O1-O0偶数进行编译。

如果没有显示,请确保使用高警告级别,-Wall-pendantic

答案 1 :(得分:0)

优化器可以发现整个循环毫无意义,但它有点复杂。循环是没有意义的,因为在循环之后不使用i和j的值,并且在循环内部仅使用j来决定何时提前中断,这并不重要,因为循环的迭代次数没有& #39;重要。所以在这种情况下,如果你将j初始化为一个随机数,你会得到完全相同的结果。所以编译器可能不会发出警告,因为不会发生任何有害的事情。

显然你有未定义的行为,因此整个应用程序可能因为未初始化的变量而崩溃。但这取决于编译器,所以如果发生这种情况,你应该收到警告。

相关问题