2016-12-25 65 views
11

當我在一個簡單的控制檯應用程序中測試後增量操作符時,我意識到我不理解完整的概念。這對我來說很奇怪:C#Post Increment

int i = 0; 
bool b = i++ == i; 
Console.WriteLine(b); 

輸出一直是錯誤的。我曾預料這將是事實。 AFAIK,在第2行,由於增量後,編譯器做了比較,並在我增加1後將b賦值爲真。但顯然我錯了。 之後,我修改了這樣的代碼:

int i = 0; 
bool b = i == i++; 
Console.WriteLine(b); 

此時輸出爲真。第一個樣本有什麼變化?

回答

9

假設i最初的值爲0,正如它在您的示例中所做的那樣。

i++ == i讀取i0),遞增i,再次讀取i1),並比較這兩個值:0 == 1

i == i++讀取i0),再次讀取i0),遞增i,並比較這兩個值:0 == 0

發生增量立即讀取舊值後。

1

回答您的代碼第一個片段:

這裏,bool b = i++ == i;0 == 1,這是因爲當你知道i++是後增量這麼i仍然0i++但後一部分被執行完畢,並正在與右側i相比,此時由於該前一後增量,該值已變爲1。這就是爲什麼你在做:bool b = i++ == i;時得到False

像@ hvd說:讀取舊值後立即增加。

+0

在第二種情況下'bool b = i == i ++;'即0 == 0這是真的,然後增量發生。就像第一個值比較,然後我增加。但在第一種情況下,它發生其他方式像'bool b = i ++ == i';即0 == 1它首先讀取0然後增加i,然後比較它時間我增加到1,這就是爲什麼他會變得虛假。 – Aamerallous

+0

這是正確的。如果你理解第一部分背後的概念,那麼第二部分代碼是可以自我理解的。在大多數編程語言中它是一樣的,這是一個基本的基本概念。 – Inconnu

1

後綴和相等運算符的評估順序是從左到右,因此代碼的行爲與代碼註釋中的說明相同。

int i = 0; 
bool b = i++ == i; 
// 1.) i++ returns old value i.e. 0 
// 2.) but after that it increments and becomes 1 
// 3.) hence, bool b = 0 == 1; --> evaluates to false 
Console.WriteLine(b); // prints false 

int i = 0; 
bool b = i == i++; 
// 1.) i returns old value i.e. 0 
// 2.) i++ returns old value i.e. 0, as this is the end of the statement after that it would increment 
// 3.) hence, bool b = 0 == 0; --> evaluates to true 
Console.WriteLine(b); // prints true