當我運行這個C#代碼時,爲什麼會得到零除異常?對於任何其他值,它返回3 * x。爲什麼除零異常發生x + = x ++ + ++ x%x-- + - x;當x = -2時
int x = -2;
x += x++ + ++x % x-- + --x;
當我運行這個C#代碼時,爲什麼會得到零除異常?對於任何其他值,它返回3 * x。爲什麼除零異常發生x + = x ++ + ++ x%x-- + - x;當x = -2時
int x = -2;
x += x++ + ++x % x-- + --x;
由於您評估0 % 0
而得到該例外。
x++
計算爲-2和x是-1:表達式如下評價。
++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 -------+----------------------------+-----------------------+---------
在第二行中,你可以看到,分母是0
時A = -2
這導致例外。
@svick答案完全符合這個問題,並且完全值得所有的迴應。 –
@ I.G.Pascual是的,這就是爲什麼我刪除了我的評論:miscalculated :) –
@DavidArno也一樣;) –
給出的規則C#用來計算表達式,你可以重寫你這樣的代碼:
int x = -2;
int a = x++;
int b = ++x;
int c = x--;
int d = --x;
x += a + b % c + d;
這裏,b
和c
值是0
。並且由於%
比+
具有更高的優先級,因此首先評估該操作。所以,這成爲:
x+= a + (0 % 0) + d;
這就是爲什麼你會得到例外。
我喜歡這一個。 –
你的公式等同於:
x = 2*x + ((2*x+2) % (x+2));
對於x >= 0
,這等於3*x
。對於x < 0
,它沒有。
對於x = -2
,這一部分試圖進行評估:-2 % 0
,這將引發DivideByZeroException
(此提到,rem
MSIL指令,對應於模運算符%
,可以拋出該異常)。它這樣做是因爲模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
(以前保持-1
)到0
並返回0
,下一部分是x--
,它修改x
到-1
但是由於它是一個後減量運算符,所以返回0
。
所以你最終
0 % 0
,因此除外。
我認爲有更容易的方法乘以3. – crashmstr
你不真的在某處使用該代碼,你? – gehho
你爲什麼要這麼做?該行代碼的維護非常糟糕! –