为什么“a + + b”有效,但“a ++ b”不能?

问题描述:

我摆弄周围有不同的东西,像这样为什么“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

的JavaScript分析器是贪婪的(它每次匹配的最长有效运营商),因此它从a++b得到++操作,使得:

(a++) b 

这是无效的。当你把空间a + + b,解析器将其解释是这样的:

(a) + (+b) 

这是啥工程以三个。

有关更多详细信息,请参阅此*有关Maximal munch的文章。

+7

我认为这是关键的答案:解析器是**贪婪**。 – Andrey

+3

如果它不是贪婪的话,那就太没用了。 'a ++'将被解释为'a ++',这是非法的。其中一个重要的见解是,在弄清楚这些令牌的含义之前,弄清楚哪些令牌是由输入组成的。所以'++'将成为'++'标记,即使该标记在该上下文中无效。 –

它读取a++,然后遇到b,不知道该如何处理它。

+3

+1最大的蒙克! –

+0

@carlnorum是的。 –

这是一元运算符区别的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 

增量运算符的Javascript运算符优先级规则没有左右关联性。这意味着a++b可以被解释为a++ ba ++b,具体取决于具体实现。无论哪种方式,这是一个语法错误,因为你有2个变量,一个一元运算符,并没有加入这两个变量。

在实际应用中:

a = 1 
b = 2; 

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

是什么意思1 3作为JS代码?

大多数编程语言解析器试图获取文本意义的最长块,所以JavaScript时看到:

[a][][][][] 

“变量” - 它是有意义的,让我们来看看下一个字符:

[a][+][][] 

“将被添加到varaible了” - 这是有意义的,让我们来看看下一个字符:

[a][+][+][] 

“会后递增变量” - 它是有意义的,让我们来看看下一个字符,

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

这是没有意义的。我有两个表达式(a ++)和(b),它们之间没有中缀运算符。

如果您制作它a+ +b它不会找到++运营商,它将作为a + + b

Longest Match规则在这里进入图片。它表示解析器必须从左到右考虑最长的标记(我认为Javascript的语法是从左到右)。所以,只要应用这个规则,你就会得到你的答案。

解析器将从左开始和在的情况下(在它们之间由于空白空间)将使一个,+,+ & B分离令牌“A + + B”。在“a ++ b”的情况下,它将应用最长匹配规则并将创建一个++作为标记。作为表达式的a ++ b没有任何语义意义,因此它不会被编译。

答案是++和+一样是一个运算符,而++是两个+运算符,而不是++运算符。

虽然它不是Javascript,但C++与+和++运算符有相似的乐趣。这是在回调时从Gurus of the Week之一调查的。