为什么C允许未初始化的局部变量?

为什么C允许未初始化的局部变量?,c,initialization,local-variables,variable-initialization,C,Initialization,Local Variables,Variable Initialization,研究Java&C等语言时,使用未初始化的局部变量是编译时错误。那么为什么C&C++允许未初始化的局部变量?这些语言允许这样做的原因是什么?我认为,如果这两种语言迫使程序员强制初始化包括指针在内的局部变量,许多不好的问题就不会出现或可以避免&这也使语言更加安全。不是吗 C被设计成一种工具,让伟大的程序员能够编写高效的代码,而不是防止初学者自食其果。允许使用未初始化的变量是这方面的一个难点 下面是一个很好的描述,从中讨论了一般未定义行为的优点 未初始化变量的使用:这通常被称为 C程序中存在的问题,有

研究Java&C等语言时,使用未初始化的局部变量是编译时错误。那么为什么C&C++允许未初始化的局部变量?这些语言允许这样做的原因是什么?我认为,如果这两种语言迫使程序员强制初始化包括指针在内的局部变量,许多不好的问题就不会出现或可以避免&这也使语言更加安全。不是吗

C被设计成一种工具,让伟大的程序员能够编写高效的代码,而不是防止初学者自食其果。允许使用未初始化的变量是这方面的一个难点

下面是一个很好的描述,从中讨论了一般未定义行为的优点

未初始化变量的使用:这通常被称为 C程序中存在的问题,有很多工具可以解决这些问题:从 编译器对静态和动态分析器的警告。这改善了 通过不要求所有变量都初始化为零来提高性能 当它们进入范围时(就像Java一样)。对于大多数标量变量, 这将导致很少的开销,但堆栈数组和malloc的内存 会产生一个内存集,这可能会非常昂贵, 特别是因为存储通常被完全覆盖


C语言以产生非常快速和高效的代码而闻名

考虑到这一点,语言不自动初始化所有变量是有意义的。对于自动初始化变量的语言,如果您以后在代码中初始化变量,它们实际上会被初始化两次,这效率较低,而且没有任何用途


你是对的,C是一种高级语言,需要有经验的开发人员更加小心,以确保问题不会因为忘记初始化变量或忘记做其他非自动的事情而产生。

C++允许它们,因为C允许。在可能的情况下,C++编译器接受有效的C程序作为输入。 至于C:在古代,内存不足,操作缓慢。初始化一个不需要初始化的变量是浪费时间和空间的

由于所有变量都必须在函数定义开始时声明(通常在初始化它们的值已知之前),因此必须使用未初始化的变量。危险,但有效率。世界上有很多权衡

int main() {
    int i;
    // Here i is uninitialized
    scanf("%d", &i);
}

您不需要在
scanf()
之前初始化
i
。在这种情况下,C不会浪费初始化所有东西的周期。

其思想是您不需要为不需要的东西付费。你并不总是需要初始化,所以你不应该总是为它付费。@meet,这是一种效率与安全的权衡。是的,这些可能是大问题。你应该知道自己在做什么,不犯错误。我知道,这是一个巨大的假设。C是一种非常古老的语言(1972年),与它的前身语言B相比,它提供了诸如“类型检查”等功能的重大改进。在那些日子里,程序的大小被限制在64KB,所以保持小的东西是至关重要的。是的。类似地,对于大型磁盘/网络缓冲区,在读取缓冲区之前初始化缓冲区也很愚蠢。@MartinJames是的,我使用了
int
,但是
char[BIG]
也是一样的(更令人担忧)。