2013-10-28 97 views

回答

13

由於您評估0 % 0而得到該例外。

  1. x++計算爲-2和x是-1:表達式如下評價。

  2. ++x % x--計算結果爲0 % 0這將拋出異常(計算餘數,你需要劃分,你不能除以零)。

明白爲什麼結果是3*x有效值考慮這個表,其中x初始值爲A

 
x  | Expression     | Value     | x after 
=======+============================+=======================+========= 
A  | x++      | A      | A + 1 
-------+----------------------------+-----------------------+--------- 
A + 1 | ++x % x--     | (A + 2) % (A + 2) = 0 | A + 1 
-------+----------------------------+-----------------------+--------- 
A + 1 | --x      | A      | A 
-------+----------------------------+-----------------------+--------- 
A  | x++ + ++x % x-- + --x  | A + 0 + A = 2*A  | A 
-------+----------------------------+-----------------------+--------- 
A  | x += x++ + ++x % x-- + --x | A + 2*A = 3*A   | 3*A 
-------+----------------------------+-----------------------+--------- 

在第二行中,你可以看到,分母是0A = -2這導致例外。

+1

@svick答案完全符合這個問題,並且完全值得所有的迴應。 –

+0

@ I.G.Pascual是的,這就是爲什麼我刪除了我的評論:miscalculated :) –

+0

@DavidArno也一樣;) –

7

給出的規則C#用來計算表達式,你可以重寫你這樣的代碼:

int x = -2; 
int a = x++; 
int b = ++x; 
int c = x--; 
int d = --x; 
x += a + b % c + d; 

這裏,bc值是0。並且由於%+具有更高的優先級,因此首先評估該操作。所以,這成爲:

x+= a + (0 % 0) + d; 

這就是爲什麼你會得到例外。

+1

我喜歡這一個。 –

0

你的公式等同於:

x = 2*x + ((2*x+2) % (x+2)); 

對於x >= 0,這等於3*x。對於x < 0,它沒有。

對於x = -2,這一部分試圖進行評估:-2 % 0,這將引發DivideByZeroException(此提到,rem MSIL指令,對應於模運算符%,可以拋出該異常)。它這樣做是因爲模0不定義就像被零除。定義模數的一種方法是除法後的餘數。由於除零之後不能計算餘數,因爲除零除外,因此模0也未定義。

0

您的公式:

x += x++ + ++x % x-- + --x; 

不等於到:

x += ((x++) + (++x)) 
     % 
    ((x--) + (--x)); 

由於%具有higher precedence+你的方程是像

x += x++ + (++x % x--) + --x; 

現在評價右側:

x++ + (++x % x--) + --x; 
    //^^^ 
    //First evaluation x returns -2 but gets modified to -1; 

由於一元運算符(++, - )具有更高的優先級,將評估第一x++它會返回-2但它會被修改,以-1這將是可用於下次使用。

現在第二部分:

(++x % x--) 
    //^^^ 
    //X returns 0 and modifies to 0 

所述第一部分具有++x返回修改x(以前保持-10並返回0,下一部分是x--它修改x-1但是由於它是一個後減量運算符,所以返回0

所以你最終

0 % 0 

,因此除外。

相關問題