C和Java的逻辑差异

时间:2010-01-08 15:14:03

标签: java c++ c operators

在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

中的输出

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

1 个答案:

答案 0 :(得分:64)

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

从链接:

  

..第二句话说:如果一个对象被写入一个完整的表达式,那么在同一个表达式中对它的任何和所有访问都必须直接参与计算要写入的值。此规则有效地将法律表达式约束为在修改之前明显存在访问的表达式。例如,允许旧备用i = i + 1,因为i的访问用于确定i的最终值。例子

 a[i] = i++
     

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

您的表达也有类似的行为。

行为在Java中已明确定义。