C和Java中的逻辑差异

用C编译并运行这个代码

#include <stdio.h> int main() { int a[] = {10, 20, 30, 40, 50}; int index = 2; int i; a[index++] = index = index + 2; for(i = 0; i <= 4; i++) printf("%d\n", a[i]); } 

输出: 10 20 4 40 50

现在在Java中相同的逻辑

 class Check { public static void main(String[] ar) { int a[] = {10, 20, 30, 40, 50}; int index = 2; a[index++] = index = index + 2; for(int i = 0; i <= 4; i++) System.out.println(a[i]); } } 

输出: 10 20 5 40 50

为什么在两种语言中都有输出差异,输出对于Java是可以理解的,但我无法理解C输出

还有一件事,如果我们应用前缀++运算符,我们在两种语言中得到相同的结果,为什么呢?

那是因为a[index++] = index = index + 2; 在C中调用未定义的行为看看这个

从链接:

..第二句话说:如果一个对象被写入到一个完整的expression式中,那么在同一个expression式中对它的任何和所有的访问都必须直接涉及要写入的值的计算。 这一规则有效地将法律expression限制在修改之前的访问。 例如,旧的备用i = i + 1是允许的,因为i的访问被用来确定i的最终值。 这个例子

  a[i] = i++ 

是不允许的,因为我( 一个[i]中的一个)的访问与最终存储在i中的值无关(这发生在i ++中),所以没有好的方法来定义 -无论是为了我们的理解还是编译器 – 访问应该在存储增量值之前还是之后进行 。 由于没有很好的方法来定义它,所以标准声明它是未定义的,并且可移植程序根本不能使用这样的构造。 类似于a[i++]=i (调用UB),您的expression式也会调用UB。

你的表情也有类似的行为。

这个行为在Java是很好定义的。