2014-01-07 34 views
4

我簡而言之讀C#5.0和我有以下語句:C#簡而言之示例誤解++一元運算符增量

int x = 0; 

while (true) 
{ 
    if (x++ > 5) 
     break ;  // break from the loop 
} 
x.Dump(); 

執行輸出爲上LINQPad 4的語句。

我還是不明白爲什麼?爲什麼它不是6是所述條件:X ++> 5個

+1

看看x ++用x做什麼,x ++與++ x不一樣。如果它是++ x而不是x ++,它將與x = 6分開。 – esrange

+3

如果我錯了,請打我,但我認爲它是前表達式。 ++在'> 5'之後被評估。 –

+1

我會建議不要編寫這樣的代碼 - 在我看來這是糟糕的partice。只是寫清楚和容易'if(x> = 7)' – WhileTrueSleep

回答

7

++操作者遞增值,並返回原始值

因此,當x爲5時,x遞增並且評估條件5 > 5

然後,當x爲6,x被遞增,並且條件6 > 5進行評價時,其導致break。由於x還在增加中,x到底值爲7

人們經常說,當++運營商作爲後綴使用時,增量比較之後執行,但是這不是技術上是真實的,這通過反編譯在LinqPad所示:

int x = 5; 
if (x++ > 5) 
Console.WriteLine(x); 

IL:

IL_0001: ldc.i4.5  
IL_0002: stloc.0  // x 
IL_0003: ldloc.0  // x 
IL_0004: dup   
IL_0005: ldc.i4.1  
IL_0006: add   // <---- Increment 
IL_0007: stloc.0  // x <-- Result of increment is popped from the stack and stored in a variable 
IL_0008: ldc.i4.5  
IL_0009: cgt   // <---- Comparison 
IL_000B: ldc.i4.0  
IL_000C: ceq   
IL_000E: stloc.1  // CS$4$0000 
IL_000F: ldloc.1  // CS$4$0000 
IL_0010: brtrue.s IL_0019 
IL_0012: ldloc.0  // x 
IL_0013: call  System.Console.WriteLine 
+0

我想找到一些關於循環的文檔和增量後返回的原始值。你能告訴我一些鏈接嗎?我找不到它 –

+0

請參閱http://msdn.microsoft.com/en-us/library/36x43w8w.aspx – Rik

+0

太好了。謝謝 !。接受的答案 –

5

x++ > 5裝置覈對5然後增量它的x值。這意味着您的break直到x == 7才被觸及。

其結果將是6如果使用++x,即增量X 然後測試針對5.

+0

很好的解釋。謝謝。從來沒有用過de x ++ –

+0

雖然實際上是相同的,並且經常用這種方式解釋,但這並不完全準確。增量在*比較之前執行*,但遞增操作的返回值是*原始值*。 – Rik

+1

@Rik技術上是正確的(最好的一種正確的!),但在理解語句方面,這使得它更容易 – CodingIntrigue

3

的原因是x++將在檢查後評估。所以,當它終於到達x == 6條件將得到滿足(6 > 5),然後事後將增加(以7

更容易一些替代的代碼,這將產生同樣的結果來解釋:

while (true) 
{ 
    if(x > 5) 
    { 
     //x = 6 
     x++; 
     //x = 7 
     break; 
    } 
    x++;//x increments from 0 - 6, over 6 loops 
} 
+0

儘管實際上是相同的,並且通常用這種方式解釋,但這並不完全準確。增量在比較之前執行,但增量操作的返回值是原始值。 – Rik

+0

@Rik ...是的,我看到您的評論來了;-) – musefan

0

當然,它是7,因爲即使當它檢查6> 5時,它也會增加1。由於一元運算符x++

+1

好的,爲什麼投下來呢? –

4

以下是循環迭代:

  • x == 0 - >比較返回false - >x增加到1
  • x == 1 - >比較返回false - >x增加到2
  • x == 2 - >比較返回false - >x增加到3
  • x == 3 - >比較返回false - >x增加到4
  • x == 4 - >比較返回false - >x增加到5
  • x == 5 - >比較返回false - >x增加到6
  • x == 6 - >比較返回true - >x增加到7 - >if - 塊被輸入並且th e循環剩餘

將輸出最後一個值x,即7

注意,x++操作修改的x值,比較x > 5後評估,但的比較是否返回true並進入if - 阻塞不管

2

你正在評估X您增加它之前,這樣你的6情況將導致休息,然後上升1到7,我認爲你期待這樣的:

int x = 0; 

while (true) 
{ 
    if (++x > 5) 
     break ;  // break from the loop 
} 
x.Dump(); 

這將增加x評估其狀況之前。

0

x讀取值後x增加x。這意味着在比較失敗後它增加一次。 ++ x在讀取值之前遞增。

+1

這個答案是無意義的;在讀取*之前,變量如何增加*?在這裏,我有一個變量x。我希望你給這個變量賦值x + 1,但是在你做之前你不允許讀取x的值。你會怎麼做? –

+0

語義上它對我來說很合理。在遞增之前,該值不會在語法上被讀取評估。在代碼本質上將變成的機器代碼中,實際上可能增加內存位置而不將其加載到寄存器中。 – Holstebroe

1

這是因爲++

++操作數X它擊中線一次上來每次。 而當你有一個while(true)循環時,它會在if語句每次達到if語句時計數一個。

4

在C#上,++一元運算符在其操作數(它可以是++ x或x ++)後面寫時,會在表達式中對進行求值後執行。這意味着:

  • 當x爲5時,表達式將被評估爲false(5不大於5),然後將其增加到6。
  • 然後,當x是6時,表達式將被評估爲是(6>> 5),但是然後它將再次增加,當x是時中斷。
+0

很好的解釋 –

+0

雖然實際上是相同的,並經常用這種方式解釋,但這並不完全準確。增量在比較之前執行,但增量操作的返回值是原始值。 – Rik