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

Why C allows uninitialized local variables?

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

C 旨在成为一种工具,让优秀的程序员能够编写高效的代码,而不是防止初学者搬起石头砸自己的脚。允许使用未初始化的变量是朝这个方向点头。

这是 this article 的一个很好的描述,它讨论了一般未定义行为的优点。

Use of an uninitialized variable: This is commonly known as source of problems in C programs and there are many tools to catch these: from compiler warnings to static and dynamic analyzers. This improves performance by not requiring that all variables be zero initialized when they come into scope (as Java does). For most scalar variables, this would cause little overhead, but stack arrays and malloc'd memory would incur a memset of the storage, which could be quite costly, particularly since the storage is usually completely overwritten.

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

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

你说得对,C 是一种高级语言,它需要有经验的开发人员多加注意,以确保不会因忘记初始化变量或忘记执行其他非自动操作而引入问题。

C++ 允许它们,因为 C 允许。在可能的情况下,C++ 编译器接受有效的 C 程序作为输入。

至于C:在过去,内存不足,操作缓慢。初始化一个 不需要初始化的变量是浪费时间和 space.

由于所有变量都必须在函数定义的开头声明(通常在初始化它们的值已知之前),未初始化的变量是必需的。危险,但有效。世界上有很多取舍。

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

您不需要 iscanf() 之前初始化。对于这种情况,C 不会浪费周期来初始化所有内容。