为什么下面的代码打印垃圾值?
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 ,那么由于越界数组访问,程序行为仍未定义。
我无法理解为什么以下代码打印垃圾值
#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 ,那么由于越界数组访问,程序行为仍未定义。