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
是很好定义的。