为什么相同的代码在java中的工作方式不同?

时间:2011-03-09 10:42:56

标签: java c

我在java和C中编写了以下代码。但这些程序的输出是不同的。 Java应用程序给出了21和C应用程序给出了22(我使用GCC编译器)。

你能描述一下吗?

这是JAVA代码。

class test
{

    public static void main(String args[])
    {
        int a =5;
        int b = (++a) + (++a) + (++a);
        System.out.println(b);
    }

}

这是C代码。

#include <stdio.h>

int main( int argc, const char* argv[] )
{
int a =5;
int b = (++a) + (++a) + (++a);
printf("%d \n",b);
}

2 个答案:

答案 0 :(得分:34)

int b = (++a) + (++a) + (++a);

这是C中的undefined behavior,这意味着它可以输出21,22,42,它可以崩溃或做任何其他想做的事情。这是UB,因为标量对象的值在同一表达式中被多次更改而没有介入sequence points

行为在Java中定义,因为它有更多的序列点。 Here's an explanatory link

答案 1 :(得分:3)

在Java评估中left to right,结果是一致的。 6 + 7 + 8 == 21