java与C的混淆--个人经验
今天碰到的一个问题:(在群里面交流后解决了)
  在C里面的一个程序是这样的:
  int  main(int argc,char *argv[]){
      int i=0,a[9];
      for(;i<10;i++){
          a[i]=0;
      }
  }
  这样一个小程序会在C里会出现什么问题?
  在群里进行了交流,超斗说是下标越界问题,我认为是死循环。
  首先我的分析是自认为for 循环定义的变量只能在循环体内生效,出了{}无效。(//这句话是对的,但是我的理解错了)
  我以为for循环的变量可以再外面声明,也对外面的变量无影响,所以i一直=0。(因为我电脑现在系统里没有C,C++,所以没验证)
  我把这个程序移植在java中,首先是下面这个程序:
  public class text {
  public static void main(String args[]) {
int i =0;
int []b1={0,1,2,3,4,5,6,7,8,};
for(;i<10;i++){
b1[i]=0;
}
System.out.println(i);
}
}
  调试结果:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
at text.main(text.java:9)
  at text.main(text.java:9)
很明显数组下标越界。
  在看一下i的输出,程序改动一下,看下面程序:
  public class text {
  public static void main(String args[]) {
int i =0;
int []b1={0,1,2,3,4,5,6,7,8,9};
for(;i<10;i++){
b1[i]=0;
}
System.out.println(i);
}
}
调试结果:10
i的值为10,证明不是死循环。(但真的不是死循环吗?)
  调试结果:10
i的值为10,证明不是死循环。(但真的不是死循环吗?)
后面要证明,就得必须到C,C++ 上运行下,在朋友的机子上运行,结果却是死循环。
  为什么呢?
C,C++虽然没有下标越界,但是会出现内存排列问题,   
                    C,C++虽然没有下标越界,但是会出现内存排列问题,
int i = 0;在内存里面占高位 a[8]其次
内存里面依次存放的是i,a[8]…………a[0]
  内存里面依次存放的是i,a[8]…………a[0]
所以a[9]的位置会占用i的位置,导致于a[9]=0;替代了i=10;使得i=0;所以产生死循环。
  第一次写关于编程的经验,希望对学习java或C,C++的朋友有所帮助。
   yuanbin
 yuanbin                              vivian0203
 vivian0203                              
                         aronftd
 aronftd                              johon
 johon