2011-08-02 52 views
2

爲什麼此代碼輸出3而不是2?請解釋,這些++和 - 操作

var i = 1; 
i = ++i + --i; 
console.log(i); 

我預計:

++i // i == 2 
--i // i == 1 
i = 1 + 1 // i == 2 

哪裏出錯了?

+1

搜索堆棧溢出的'++'和' - '後綴和前綴運算符 –

+0

++ i = 2,則i = 2, - i = 1因此2 + 1 = 3因爲javascript語句是從左到右。 – Joe

+2

由你自己的邏輯,我應該等於3. – kinakuta

回答

10

的變化:

  1. 增量i(2 )
  2. i爲左邊添加(2)
  3. 遞減i(1)
  4. i的是加入的右側(1)
  5. 執行加法和分配給i(3)

...見到了你嘗試這樣做這讓我對JSLint爲什麼不喜歡++--有所瞭解。

2

你的第二行是添加2 + 1

爲了,解釋器將執行:按照以下順序執行

++i // i == 2 
+ 
--i // i == 1 
i = 2 + 1 
0

您在操作順序上是有點過。下面是如何不言而喻:

  1. i由1(++ i)因該被存儲在我 值2遞增。
  2. 的兩塊值然後加入到(--I) ,它的數值是1 2 + 1 = 3
0

因爲當你使用++ I I的值被遞增,然後回。但是,如果使用i ++,則返回i的值,然後遞增。 Reference

3

看它這樣

X =(東西)
X =(++ⅰ)+(東西)
X =(2)+(東西)
X =(2) +(--i)
X =(2)+(1)

術語被評估從左至右,一旦第一++ i的評價它不會被當改變重新評價其價值與--i。

0
++$a Increments $a by one, then returns $a. 
$a++ Returns $a, then increments $a by one. 
--$a Decrements $a by one, then returns $a. 
$a-- Returns $a, then decrements $a by one. 
0

因爲你希望這個代碼,如果這是一個參考對象,而不是收集到的值,直到一元操作完成的工作。但在大多數語言中,首先評估表達式,所以我返回i的值,而不是i本身。

如果你有++( - i),那麼你會是對的。

總之,不要這樣做。

該操作的結果在每種語言/編譯器/解釋器中沒有定義相同。所以雖然它在JavaScript中導致3,但在其他地方可能導致2