C语言中,没有对变量进行初始化但是结果是对的,为什么

在定义i和j两个变量时,已经对j进行了赋值,但是不是必须要对i初始化吗?没对i赋值不就出错了嘛?为什么我这里对i初始化和不对i初始化编译的结果都是一样的?

img

碰巧j所分配的内存为0,那么就似乎是“对的”,但这只是撞大运。
C语言不会去额外初始化变量

尽管变量未初始化,可能会偶尔出现结果正确的情况,但这是偶然的,不能保证在每次运行程序时都是正确的。这是因为未初始化的变量的值是不可预测的,可能是随机的数字或其他垃圾值。所以,依赖于未初始化变量的结果是不可靠的,并且可能会导致程序的不稳定和不可预测的行为。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7517900
  • 这篇博客你也可以参考下:以下程序从读入的整数数据中,统计大于零的整数个数和小于零的整数个数。用输入零来结束输入,程序中用i统计大于零的个数,用变量j统计小于零的整数。
  • 除此之外, 这篇博客: 考研数据结构之串(4.4)——练习题之编写一个函数来删除串中从下标为i的字符开始的j个字符,如果下标为i的字符后没有足够的j个字符,则有几个删除几个(C表示)中的 分析 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 从下标为i+j个字符开始,将所有的字符都向前移动j个位置,然后将字符串长度缩减为被删除字符的个数即可。

    其实算法思想很简单,就是顺序表的移动元素而已,串是属于比较特殊的顺序表,元素是字符。

    图解:

  • 以下回答由chatgpt基于相关博客总结生成:

    问题中提到的C语言程序的代码如下所示:

    #include <stdio.h>
    int main() {
        int n, i, j;
        printf("Enter INT numbers, with 0 to end\n");
        i = j = 0;
        scanf("%d",&n);
        while (n != 0) {
            if (n > 0)
                i++;
            if (n < 0)
                j++;
            scanf("%d",&n);
        }
        printf("i=%4d j=%4d\n",i,j);
    }
    

    这段代码实现了一个功能,即统计用户输入的正数和负数的个数。在这段代码中,虽然变量i被声明了但没有进行显式的初始化,但无论是否对i进行初始化,最终的结果都是正确的。这是因为C语言中,在一些编译器的实现中,声明的变量的存储空间会在分配时被清零,可以认为被默认初始化为0。

    这是C语言的一些编译器对于未初始化的局部变量的行为的一种约定。当局部变量被分配内存空间时,并不会立即把原先该内存空间中的值清零,而是在符合编译器的优化条件时进行,例如某些优化级别下的编译器会尽量不重复地初始化相同的变量等,这意味着你不能依赖未初始化的变量存储空间的内容始终为0,但在实际情况中,它可能会为了安全起见而明确地将存储空间中的内容初始化为0。

    总结一下就是,C语言编译器对于未初始化的局部变量会有一些默认的行为,可能会将其初始化为0,但这不能作为标准依赖的依据。所以在编写代码时,最好还是对变量进行显式的初始化,以避免潜在的问题和不确定行为。