为什么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;
}
答案 0 :(得分:1)
您可能会在高优化级别对其进行编译,这会导致为了优化目的而删除循环。
请尝试在-O1
或-O0
偶数进行编译。
如果没有显示,请确保使用高警告级别,-Wall
和-pendantic
答案 1 :(得分:0)
优化器可以发现整个循环毫无意义,但它有点复杂。循环是没有意义的,因为在循环之后不使用i和j的值,并且在循环内部仅使用j来决定何时提前中断,这并不重要,因为循环的迭代次数没有& #39;重要。所以在这种情况下,如果你将j初始化为一个随机数,你会得到完全相同的结果。所以编译器可能不会发出警告,因为不会发生任何有害的事情。
显然你有未定义的行为,因此整个应用程序可能因为未初始化的变量而崩溃。但这取决于编译器,所以如果发生这种情况,你应该收到警告。