2011-09-20 129 views
38

我擺弄周圍有不同的東西,像這樣爲什麼「a + + b」有效,但「a ++ b」不能?

var a = 1, b = 2; 
alert(a + - + - + - + - + - + - + - + b); //alerts -1 

,我可以刪除空格,它仍然能工作。

a+-+-+-+-+-+-+-+b 

然後我試圖

a + + b 

它跑,評價3,但是當我刪除了空間,(a++b),它不會運行,並且它有它讀「混亂加分的警告「。

我可以理解,在情況下,像

a+++++b 

這可以解釋爲以下任何

(a++) + (++b) 
(a++) + +(+b) 
a + +(+(++b)) 
a + +(+(+(+b))) 

,這將是混亂的。

但在

a++b 

解釋這一點,據我可以告訴的唯一有效辦法的情況下,是

a + +b 

爲什麼不a++b工作?

+8

我想它與++是有效的synax或++ b衝突。 – TheCodeKing

+3

它也可以解釋爲(a ++)b或(++ b)... –

+0

'++ b'也是有效的 – Andrew

回答

57

的JavaScript分析器是貪婪的(它每次匹配的最長有效運營商),因此它從a++b得到++操作,使得:

(a++) b 

這是無效的。當你把空間a + + b,解析器將其解釋是這樣的:

(a) + (+b) 

這是啥工程以三個。

有關更多詳細信息,請參閱此維基百科有關Maximal munch的文章。

+7

我認爲這是關鍵的答案:解析器是**貪婪**。 – Andrey

+3

如果它不是貪婪的話,那就太沒用了。 'a ++'將被解釋爲'a ++',這是非法的。其中一個重要的見解是,在弄清楚這些令牌的含義之前,弄清楚哪些令牌是由輸入組成的。所以'++'將成爲'++'標記,即使該標記在該上下文中無效。 –

12

它讀取a++,然後遇到b,不知道該如何處理它。

+3

+1最大的蒙克! –

+0

@carlnorum是的。 –

7

這是一元運算符區別的b/c。

"a + + b" is the same as "a + (+b)" 
"a++b" is the same as "(a++) _ b" <--- there is a missing operator where the _ is 
3

增量運算符的Javascript運算符優先級規則沒有左右關聯性。這意味着a++b可以被解釋爲a++ ba ++b,具體取決於具體實現。無論哪種方式,這是一個語法錯誤,因爲你有2個變量,一個一元運算符,並沒有加入這兩個變量。

在實際應用中:

a = 1 
b = 2; 

a++ b; -> 2 2 
a ++b; -> 1 3 

是什麼意思1 3作爲JS代碼?

3

大多數編程語言解析器試圖獲取文本意義的最長塊,所以JavaScript時看到:

[a][][][][] 

「變量」 - 它是有意義的,讓我們來看看下一個字符:

[a][+][][] 

「將被添加到varaible了」 - 這是有意義的,讓我們來看看下一個字符:

[a][+][+][] 

「會後遞增變量」 - 它是有意義的,讓我們來看看下一個字符,

[a][+][+][b] 

這是沒有意義的。我有兩個表達式(a ++)和(b),它們之間沒有中綴運算符。

如果您製作它a+ +b它不會找到++運營商,它將作爲a + + b

1

Longest Match規則在這裏進入圖片。它表示解析器必須從左到右考慮最長的標記(我認爲Javascript的語法是從左到右)。所以,只要應用這個規則,你就會得到你的答案。

解析器將從左開始和在的情況下(在它們之間由於空白空間)將使一個,+,+ & B分離令牌「A + + B」。在「a ++ b」的情況下,它將應用最長匹配規則並將創建一個++作爲標記。作爲表達式的a ++ b沒有任何語義意義,因此它不會被編譯。

0

答案是++和+一樣是一個運算符,而++是兩個+運算符,而不是++運算符。

雖然它不是Javascript,但C++與+和++運算符有相似的樂趣。這是在回調時從Gurus of the Week之一調查的。

相關問題