2011-03-09 105 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

相關問題