我是從結束結果這2塊的碼之一之間的C++其他在c#想。 這兩個塊給出不同的結果,沒有任何意義,任何解釋都會有幫助。
//c++
int x=0;
x=x++ + ++x;// result=3
//c#
int x=0;
x=x++ + ++x;// result=2 (logical answer)
我是從結束結果這2塊的碼之一之間的C++其他在c#想。 這兩個塊給出不同的結果,沒有任何意義,任何解釋都會有幫助。
//c++
int x=0;
x=x++ + ++x;// result=3
//c#
int x=0;
x=x++ + ++x;// result=2 (logical answer)
在C++中,這是未定義的行爲,因爲這裏已經討論了一個巨大的次數。在C#中,行爲已被很好地定義。由於未定義的行爲,可能會有任何結果。
無論行爲是否定義良好,您都不應該這樣寫代碼。
+1對於gazillion – KevinDTimm
gazillion是一種輕描淡寫。 – Marlon
在C++中我相信行爲是未指定的。
在C#中,評估的順序通常更加嚴格,並且答案是有保證的。
在任何一種語言中,都應該避免這樣的代碼。這很難理解,並且通常是爲了顯示作者是多麼「聰明」,而不是創建可以很容易地看到是正確的代碼,並在必要時進行更改。
@HusseinX:究竟是什麼原因?你有兩種不同的語言,有兩種不同的規格。在某些情況下,看起來像他們會給出相同答案的操作不會。這應該*預期*與兩種不同的語言。 –
@HusseinX Jon和我都解釋了原因。你的代碼是C++中的UB。 –
搜索:序列點C++ – Nim
http://en.wikipedia.org/wiki/Sequence_point – Mahesh