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

时间:2015-01-09 06:59:37

标签: java c

在C中,代码段:

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

产生以下输出:

0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000

然而,在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]);
        }

产生以下输出:

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)

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

2 个答案:

答案 0 :(得分:6)

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

另请注意,java数组具有length属性,这样可以轻松避免此类错误。在C情况下,可以通过小心使用sizeof运算符来获取数组的长度。但是经常使用指针而不是数组的事实(例如,当你将一个数组“传递”到一个带有指向数组元素的指针的函数时)意味着通常不会提供大小信息。

答案 1 :(得分:0)

在C中,我们可以访问未初始化为该变量的元素。在java中我们不能 去做。它严格检查边界数组。

  

每当数组中的元素出现时,Java都会执行边界检查   访问。边界检查是对数组索引的访问的位置   检查数组的大小 - 如果是,则抛出异常   该数组索引超出范围,并且大于该数组的大小   阵列。

C不执行边界检查。