我不明白为什么下面的代码打印垃圾值
#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]);
}
我不明白为什么下面的代码打印垃圾值
#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
上进行写操作,这超出了 的范围,并会导致未定义的行为。
未初始化的局部变量将具有一个 indeterminate 值,该值可能被视为随机或垃圾。
我建议您也有一个for
循环,就像用于打印初始化值的循环一样。
for (i = 0; i < 5; ++i)
arr[i] = i + 1;
,
在您同时读写BeforeMethod
时,表达式arr[i] = ++i
是未定义。
i
不是排序点,因此您不能假设在获取=
的索引之前先增加i
。
即使 arr
在获取i
的索引之前已经增加(因为某些语言(例如C ++ 17)要求这样做,程序的行为也是如此)由于超出范围的数组访问,仍将是未定义的。