2015-11-02 64 views
0

當我要評估這個表達式我使用從C#我不uderstand數學結果1 + 2 * 3 * + 4 * 5 = 121

public double CalculateExpression() 
    { 
     double result = -1; 

     var javascriptLangualeType = Type.GetTypeFromCLSID(Guid.Parse("0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC")); 
     dynamic obj = Activator.CreateInstance(javascriptLangualeType, false); 
     obj.Language = "javascript"; 

     try 
     { 
      result = obj.Eval(Expression); 
      Result = result.ToString(); 
     } 
     catch (Exception) 
     { 

      Result = "ERROR"; 
     } 

     return result; 
    } 

這個代碼(內部爲 '*' 和 '+' ):

var expresion = "1+2*3*+4*5"; 

我希望我得到的例外[R任何其他類型的錯誤,但這個結果是121誰能告訴我這是爲什麼表情識別爲有效?

我試着在C#腳本這種表達,也得到了我121導致

謝謝。

+1

一元加號是一樣的逆元負 – fixmycode

+0

雖然這種表達是實際上,您對許多語言都有效,其中幾乎任何內容都是有效的 - 請參閱着名的[Javascript WAT talk](https://www.destroyallsoftware.com/talks/wat)。 –

回答

6

因爲它這樣做:

1 + (2 * 3 * (+4) * 5) 

這與負清晰,因爲我們通常不使用+4表示4

1+2*3*-4*5 

擴展到

1 + (2 * 3 * (-4) * 5) 
-1

右優先於*優先於+。

所以(1)+(2 *(3 *(+(4 * 5))))= 121

它有助於它讀從右到左。 另外,+符號被視爲20或「20」這不是一個操作,但是,從值的正/負符號(4 * 5)

+0

錯誤:) - 一元運算符在幾乎所有語言中都具有更高的優先級 - 絕對是JavaScript。 –

+0

我期望評估繼續留下+,並看到*會導致*贏得「贏」,迫使+符號成爲(4 * 5)so(+(4 * 5) )或(+20)乘以3.這就是爲什麼我永遠不會依賴於我所做過的任何事情的先後順序。我不相信任何運行時間,因爲我可能錯了,或者錯過了一個指數或類似的東西。 –

相關問題