2011-03-09 73 views
9

我在java和C中编写了下面的代码,但是这些程序的输出是不同的。 Java应用程序给了21和C应用程序给了22(我使用GCC编译器)。为什么相同的代码在java中的工作方式不同?

你能形容这个吗?

这是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); 
} 
+1

如果不是很明显,你绝对不应该这样写这样的代码,在不属于“Hello world”类型的程序中的程序中。 – darioo 2011-03-09 10:46:56

+3

@darioo永远永远=永远。就像'!! a'。 – 2011-03-09 10:48:48

+4

@Radek:英语有点不同 – darioo 2011-03-09 10:50:05

回答

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

这是用C undefined behavior,这意味着它可以输出21,22,42,它可能会崩溃或做它想要任何其他。这是UB,因为标量对象的值在同一个表达式中不止一次更改,而不会干预sequence points

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

+0

为什么这是未定义的? – Janaka 2011-03-09 10:45:18

+0

@Janaka:请参阅我的编辑 – 2011-03-09 10:45:45

+0

是否在Java中定义了行为? – Thilo 2011-03-09 10:47:42

3

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

相关问题