2010-11-27 59 views
5

我曾嘗試在C#和C++以下的事情:C#和C++中的評估順序是什麼?

int a = 5; 
int b = (a++)+(++a)+(a--)+(--a); 

我試圖讓b在C#和C++的結果。 但我在兩個方面都得到了不同的答案。

我在C#中得到了23個,在C++中得到了20個。

那麼,請回答我爲什麼這樣呢?這可能是什麼原因?

回答

7

C#從左到右進行評估。在C++中,funny expressions(如您的調用undefined behavior)是因爲您正在更改變量並重新讀取它,而沒有介入sequence point

這意味着不同的編譯器(或甚至具有不同優化設置的相同編譯器)被允許(並且通常)產生(a++)+(++a)+(a--)+(--a)的不同結果。

0

查看here獲取C++的完整列表。正如FredOverflow說,C#評估來自左到右

+2

我不認爲對尖端`@`語法跨越答案工程:) – fredoverflow 2010-11-27 11:15:31

+0

編輯了:-P謝謝。 – Bojangles 2010-11-27 11:19:11

4

表達已明確定義在C#行爲(從評價從左到右)

在C#,輸出將是24(未23)

int b = (a++)+(++a)+(a--)+(--a); 

     // 5 + 7 + 7 + 5 = 24 

在C++中,表達式調用Undefined Behaviour,因爲a在兩個sequence points之間被修改了不止一次。

0

無論如何我都需要看這個,所以我想在這裏發表。

從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