2014-02-11 92 views
0

我用C跑以下程序++(DEC-C++):爲什麼Unary Post Operators在C++和Java中表現不同?

int k = 5; 
k = k++; 
cout<<"Value of K :"<<k<<endl; 

int l = 5; 
l = l++ + l++; 
cout<<"Value of L :"<<l<<endl; 

int m = 5; 
m = m++ + m++ + m++; 
cout<<"Value of M :"<<m<<endl; 

,得到了5,12和18個變量K,l和m ..但是相同的節目,當我在Java運行 -

int k = 5; 
k = k++; 
System.out.println("Value of K :"+k); 

int l = 5; 
l = l++ + l++; 
System.out.println("Value of L :"+l); 

int m = 5; 
m = m++ + m++ + m++; 
System.out.println("Value of M :"+m); 

我得到了變量K,L和M 5,11和18 ..

解釋爲什麼在一元后運營商的計算差別?我知道運營商的優先級和優先級規則。但是這裏的每件事都失敗了但根據規則,C++的回答似乎是合理的。困惑java如何計算?

衆所周知,C++和Java是不同的。請建議如何在Java中處理運算符優先級和運算符優先級。

+4

C++之一是未定義的行爲。 Java中有一個被記錄。 – chris

+2

[未定義行爲和序列點]的可能重複(http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points) - C++和Java是兩種不同的語言;在Java中,行爲是明確定義的。 –

+0

@BrianRoach:這個問題解釋了C++的行爲。他對C++行爲不感興趣(儘管他應該這樣做,因爲他對此的解釋完全錯誤)。這是他不瞭解的Java行爲。 –

回答

1

Java的規則在這裏很簡單。子表達式(對postfix運算符的每個調用)都從左到右進行計算,每個子表達式在下一個之前完全評估。

int k = 5; 
k = k++; 

這遞增k至6,但返回其先前的值(5),並重新分配該至k。所以k是5.

int l = 5; 
l = l++ + l++; 

第一l++增量l至6,並評估其先前值(5)。然後下一l++被調用,它遞增l〜7,計算結果爲6。5和6被加在一起,並分配給l,導致11

int m = 5; 
m = m++ + m++ + m++; 

使用相同的處理之前,我們只是再做一次,所以這相當於增加了5 + 6 + 7並將結果分配給了m,它變成了18.

儘管您聲稱自己理解它,但C++並不那麼簡單。事實上,這是未定義的行爲,正如在this question的答案中詳細解釋的那樣。沒有規則,你可以看到任何結果。不要這樣做。

+0

@Benjamin ..我也做了如上所示的相同的解決方法。令人驚訝的是它起作用並給出了正確的答案。但不知道這是一種解決方法或可以作爲一個定義規則。 – Jain

+1

@ALEN:你在談論什麼解決方法?解決方法是什麼? –

+0

@Benjamin ..我在說「5 + 6 + 7解決方法」。一元增量和減量運算符預先處理對象的內存位置。所以在C++中,它將首先添加所有5,然後執行一元運算符。例如.5 + 5 + 5 = 15,然後執行三次減量 – Jain

相關問題