继“java小编程运行时错误”之后的c语言问题。

来源:百度知道 编辑:UC知道 时间:2024/07/02 16:05:24
#include "stdio.h"
main(){
int a[10];
int i,j,t;
printf("input 10 number:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(j=0;j<10;j++)
for(i=0;i<10-j;i++)
if(a[i]<a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("the sorted number:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
上面的试了没问题。我的问题是,第二个for循环里的i=9时,后面的a[i+1]岂不是越界了?数组定义了10个元素,而a[10]是第十一个元素了!不好意思分已经用完了。
而在java里如果也把第二个for循环条件要写成i<9-j才能运行(编译可通过)。这是咋回事呢?c语言里的是偶然吗,怎么还这样?

确实如此,这个程序能够正常运行,只是偶然的。

1、C语言编译器没有针对数组下标越界进行预防处理,而把这个责任交给了程序员,即程序员自己来发现这类问题。由于程序隐含了这类问题,所以程序的运行结果是不稳定的。
2、在Java中,Java虚拟机在运行Java程序时,会主动判断数组下标是否越界。因此,在运行时通过异常机制来通知程序员。
3、两者的共同点是,数组下标越界问题总是在程序运行时表现出来。只是前者可能会表现出来,而后者是被Java虚拟机发现并表现出来的。