2011-10-17 34 views
5

考慮:爲什麼輸出的不同之處C和Java表達式M + + +(++米)

int m = 2, n; 

n = m++ + (++m); 

在C輸出是:

m = 4, n = 4; 

在Java輸出是:

m = 4, n = 5; 

這是怎麼發生的?

+0

你使用哪種編譯器?相同的代碼爲我提供了m = 4和n = 6(Visusal Studio 2010) –

+0

這是因爲您無法在沒有序列點的語句中兩次更改同一個變量。這會導致C中的未定義行爲。 – Dani

+0

我正在使用gcc。 – phoxis

回答

9

它可以不同,因爲C不允許正確的程序包含這樣的表達式 - C沒有定義這樣的程序的行爲。這給C編譯器在如何解釋這些表達式方面提供了很大的自由度。

Java通過定義像這樣的表達式的預期行爲來更緊密地約束實現。

(這在C中斷裂的規則是表達式可能不會在沒有插入序列點的情況下多次修改對象的值)。

+1

「C不允許正確的程序包含這樣的表達式。」是的,它確實;它只是沒有指定它的行爲。不是一回事。 – EJP

+0

@EJP:這樣的程序不正確。 – caf

+0

如果這樣的程序不正確,編譯器不應該編譯它。 – EJP

相關問題