为什么在C和Java中为相同的代码显示了不同的行为?

use*_*020 3 c java

在C中,代码片段:

int i;
    double x[10];
    for (i = 0; i <= 10; i++) {
        x[i] = (double) i;
        printf("%f\n", x[i]);
    }
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000
Run Code Online (Sandbox Code Playgroud)

但是,在Java中,代码片段(相同的代码)只是语法上的不同:

int i;
        double[] x = new double[10];
        for (i = 0; i <= 10; i++) {
            x[i] = (double) i;
            System.out.printf("%f\n", x[i]);
        }
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
    at Array.main(Array.java:14)
Run Code Online (Sandbox Code Playgroud)

为什么C编译器没有标记在数组边界外访问的尝试?我在这里错过了什么吗?

jua*_*nza 6

Java有数组边界检查,C没有.在Java中,当您访问索引10时会出现运行时异常,在C中您会得到未定义的行为.在这种情况下,你写10.0了一些你不允许的地方,但是由于运气不好,程序就完成了.

还要注意java数组有一个length属性,这样可以很容易地避免这种错误.在C情况下,可以通过仔细使用sizeof运算符来获得数组的长度.但是经常使用指针而不是数组的事实(例如,当你将一个数组"传递"到一个带有指向数组元素的指针的函数时)意味着通常不会提供大小信息.