我曾嘗試在C#和C++以下的事情:C#和C++中的評估順序是什麼?
int a = 5;
int b = (a++)+(++a)+(a--)+(--a);
我試圖讓b在C#和C++的結果。 但我在兩個方面都得到了不同的答案。
我在C#中得到了23個,在C++中得到了20個。
那麼,請回答我爲什麼這樣呢?這可能是什麼原因?
我曾嘗試在C#和C++以下的事情:C#和C++中的評估順序是什麼?
int a = 5;
int b = (a++)+(++a)+(a--)+(--a);
我試圖讓b在C#和C++的結果。 但我在兩個方面都得到了不同的答案。
我在C#中得到了23個,在C++中得到了20個。
那麼,請回答我爲什麼這樣呢?這可能是什麼原因?
C#從左到右進行評估。在C++中,funny expressions(如您的調用undefined behavior)是因爲您正在更改變量並重新讀取它,而沒有介入sequence point。
這意味着不同的編譯器(或甚至具有不同優化設置的相同編譯器)被允許(並且通常將)產生(a++)+(++a)+(a--)+(--a)
的不同結果。
查看here獲取C++的完整列表。正如FredOverflow說,C#評估來自左到右
表達已明確定義在C#行爲(從評價從左到右)
在C#,輸出將是24(未23)
int b = (a++)+(++a)+(a--)+(--a);
// 5 + 7 + 7 + 5 = 24
在C++中,表達式調用Undefined Behaviour,因爲a
在兩個sequence points之間被修改了不止一次。
無論如何我都需要看這個,所以我想在這裏發表。
從C#5.0規格
5.3.3.21通用規則表達式以下規則適用於這些類型的表達式嵌入式表達式
:括號表達式(§7.6.3)元素訪問表達式(第7.6.6節),帶索引的基本訪問表達式(第7.6.8節),遞增和遞減表達式(第7.6.9節,第7.7.5節),強制表達式(第7.7.6節),一元+ - ,〜,*表達式,二進制+, - ,*,/,%,< <,>>,<,< =, - >,=,==,!=,是,&,|,^表達式(§7.8,§7.9,§7.10,§7.11),複合賦值表達式(§7.17.2),勾選和未勾選的表達式§7.6.12),再加上數組和委託創建表達式(§7.6.10)。
這些表達式中的每一個都有一個或多個子表達式,這些子表達式以固定順序(重點礦井)無條件地被評估爲。例如,二進制%運算符評估操作符的左側,然後評估右側。索引操作評估索引表達式,然後按照從左到右的順序評估每個索引表達式。
每種表達式的詳細規則請參見第7節。我不會在這裏列出所有這些表達式,但啓發式是按照代碼寫成的。例如。
7.5.1.2參數的運行時評估列出
參數列表中的表達在它們的排列順序一直被運用。因此,示例
class Test { static void F(int x, int y = -1, int z = -2) { System.Console.WriteLine("x = {0}, y = {1}, z = {2}", x, y, z); } static void Main() { int i = 0; F(i++, i++, i++); F(z: i++, x: i++); } }
產生輸出
x = 0, y = 1, z = 2 x = 4, y = -1, z = 3
我不認爲對尖端`@`語法跨越答案工程:) – fredoverflow 2010-11-27 11:15:31
編輯了:-P謝謝。 – Bojangles 2010-11-27 11:19:11