我不明白为什么下面的代码打印垃圾值
#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
处进行写,这是out of bounds,并且会导致undefined behavior。
未初始化的局部变量将具有一个indeterminate值,该值可能被视为随机或垃圾。
我建议您也有一个for
循环,就像用于打印初始化值的循环一样:
for (i = 0; i < 5; ++i)
arr[i] = i + 1;
表达式arr[i] = ++i
是未定义,因为您正在同时读写i
。
=
不是序列点,因此不能假设在获取i
的索引之前先增加了arr
。
即使 i
在获取arr
的索引之前已被增加(因为在某些语言中,例如C ++ 17,这是必需的,所以由于输出不正确,程序行为仍将是不确定的边界数组访问)。