我簡而言之讀C#5.0和我有以下語句:C#簡而言之示例誤解++一元運算符增量
int x = 0;
while (true)
{
if (x++ > 5)
break ; // break from the loop
}
x.Dump();
執行輸出爲上LINQPad 4的語句。
我還是不明白爲什麼?爲什麼它不是6是所述條件:X ++> 5個
我簡而言之讀C#5.0和我有以下語句:C#簡而言之示例誤解++一元運算符增量
int x = 0;
while (true)
{
if (x++ > 5)
break ; // break from the loop
}
x.Dump();
執行輸出爲上LINQPad 4的語句。
我還是不明白爲什麼?爲什麼它不是6是所述條件:X ++> 5個
的++
操作者遞增值,並返回原始值。
因此,當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
我想找到一些關於循環的文檔和增量後返回的原始值。你能告訴我一些鏈接嗎?我找不到它 –
請參閱http://msdn.microsoft.com/en-us/library/36x43w8w.aspx – Rik
太好了。謝謝 !。接受的答案 –
x++ > 5
裝置覈對5
然後增量它的x
值。這意味着您的break
直到x == 7
才被觸及。
其結果將是6如果使用++x
,即增量X 然後測試針對5.
很好的解釋。謝謝。從來沒有用過de x ++ –
雖然實際上是相同的,並且經常用這種方式解釋,但這並不完全準確。增量在*比較之前執行*,但遞增操作的返回值是*原始值*。 – Rik
@Rik技術上是正確的(最好的一種正確的!),但在理解語句方面,這使得它更容易 – CodingIntrigue
當然,它是7,因爲即使當它檢查6> 5時,它也會增加1。由於一元運算符x++
。
好的,爲什麼投下來呢? –
以下是循環迭代:
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
- 阻塞不管。
你正在評估X您增加它之前,這樣你的6情況將導致休息,然後上升1到7,我認爲你期待這樣的:
int x = 0;
while (true)
{
if (++x > 5)
break ; // break from the loop
}
x.Dump();
這將增加x評估其狀況之前。
x讀取值後x增加x。這意味着在比較失敗後它增加一次。 ++ x在讀取值之前遞增。
這個答案是無意義的;在讀取*之前,變量如何增加*?在這裏,我有一個變量x。我希望你給這個變量賦值x + 1,但是在你做之前你不允許讀取x的值。你會怎麼做? –
語義上它對我來說很合理。在遞增之前,該值不會在語法上被讀取評估。在代碼本質上將變成的機器代碼中,實際上可能增加內存位置而不將其加載到寄存器中。 – Holstebroe
這是因爲++
的++
操作數X它擊中線一次上來每次。 而當你有一個while(true)
循環時,它會在if語句每次達到if語句時計數一個。
在C#上,++一元運算符在其操作數(它可以是++ x或x ++)後面寫時,會在表達式中對進行求值後執行。這意味着:
很好的解釋 –
雖然實際上是相同的,並經常用這種方式解釋,但這並不完全準確。增量在比較之前執行,但增量操作的返回值是原始值。 – Rik
看看x ++用x做什麼,x ++與++ x不一樣。如果它是++ x而不是x ++,它將與x = 6分開。 – esrange
如果我錯了,請打我,但我認爲它是前表達式。 ++在'> 5'之後被評估。 –
我會建議不要編寫這樣的代碼 - 在我看來這是糟糕的partice。只是寫清楚和容易'if(x> = 7)' – WhileTrueSleep