4

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

4

4 回答 4

5

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

考虑到这一点,语言不自动初始化所​​有变量是有意义的。对于自动初始化变量的语言,如果您稍后在代码中对其进行初始化,它们实际上会被初始化两次,这样效率较低且毫无用处。

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

于 2015-02-16T17:11:25.693 回答
4
int main() {
    int i;
    // Here i is uninitialized
    scanf("%d", &i);
}

之前不需要i初始化scanf()。对于这种情况,C 不会浪费循环初始化所有内容。

于 2015-02-16T17:12:09.720 回答
1

C 旨在成为一种工具,让优秀的程序员可以编写高效的代码,而不是防止初学者误入歧途。允许使用未初始化的变量是朝这个方向点头。

这是这篇文章的一个很好的描述,它通常讨论了未定义行为的优点。

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

于 2015-02-16T17:10:23.420 回答
1

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

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

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

于 2015-02-16T17:12:08.873 回答