为什么这段代码不会产生编译时错误? INT_MAX是一个宏,它保存可存储在int中的最大值,但未声明minVal,并在打印时生成值0。我用c99编译。
#include <limits.h>
#include <stdio.h>
int main() {
int max = INT_MAX, minVal;
printf("Value of max: %d", max);
printf("Value of minVal: %d", minVal);
// Output
// 2147483647
// 0
return 0;
}
答案 0 :(得分:1)
编译器不需要将minVal
置于此处的自动变量初始化为任何内容。
安全选项是初始化它。
如果您希望编译器在您不在时发出警告,则可以设置命令行选项。在gcc中,-Wall
将完成这项工作,但-Wunitialized
会更具体地执行此操作。 (据我所知,您提到的C99可能是gcc的包装器。)
答案 1 :(得分:1)
在您的程序中minVal
已声明并已定义,但从未初始化。
您的程序通过访问minVal
函数调用中未初始化的对象printf
来调用未定义的行为。
C不需要编译器的诊断或转换错误。允许编译器输出诊断或停止转换(除其他外)但不是必需的。
答案 2 :(得分:0)
您将minVal声明为本地int变量,在这种情况下,您从它读取0是因为它是初始值,但请注意,如果不将其初始化为零,则每个局部变量不会始终为零(在变量声明时= 0),因为标准不要求它为零(局部变量在堆栈中分配,因此由于先前使用堆栈区域而具有未定义的初始值) 只有全局变量的默认值为初始值