为什么下面的代码打印垃圾值?

Why the following code printing garbage value?

我无法理解为什么以下代码打印垃圾值

#include <stdio.h> 

void main(){
 int arr[5],i=0;
 while(i<5)
    arr[i]=++i;
for(i=0;i<5;i++)
    printf("%d",arr[i]);
 }

声明

arr[i]=++i;

实际上等同于

i = i + 1;
arr[i] = i;

这意味着您不会初始化数组中的第一个元素(在索引 0 处)。更糟糕的是,你也会在索引 5 处写入,那是 越界 并且会导致 未定义的行为 .

未初始化的局部变量将有一个不确定的值,这可能被视为随机或垃圾。

我建议您使用一个 for 循环,就像用于打印初始化值的循环一样:

for (i = 0; i < 5; ++i)
    arr[i] = i + 1;

表达式 arr[i] = ++i 未定义 因为您同时从 i 读取和写入。

= 不是 序列点 所以你不能假设 i 在获取 arr 的索引之前增加.

即使 i 在获取 arr 的索引之前增加(因为在某些语言中需要这样做,例如 C++17 ,那么由于越界数组访问,程序行为仍未定义。