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

我正在摆弄不同的事情,像这样

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

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

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

然后我试了一下

 a + + b 

它运行并评估为3,但是当我删除空格时,( a++b )将不会运行,并且会有一个警告,其中显示“Confusing plusses”。

我可以理解,在像

 a+++++b 

这可以解释为以下任何一种情况

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

这将是混乱。

但在这种情况下

 a++b 

据我所知,解释这个唯一有效的方法是

 a + +b 

为什么不a++b工作?

Javascriptparsing器是贪婪的(它每次匹配最长的有效运算符),所以它从a++b得到++运算符,从而:

 (a++) b 

这是无效的。 当你把空格a + + b ,分析器解释它是这样的:

 (a) + (+b) 

这是有效的,并成为三个。

有关更多详细信息,请参阅关于Maximal munch的维基百科文章。

它正在阅读a++ ,然后遇到一个b ,并不知道该怎么做。

这是一元运算符的差别的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个variables,一个一元运算符,并没有join这两个variables。

实际上,

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

JS代码是什么意思?

大多数编程语言parsing器试图获得最有意义的文本块,所以当Javascript看到:

 [a][][][][] 

“variablesa” – 这是有道理的,让我们看看下一个字符:

 [a][+][][] 

“将增加变化的一个” – 这是有道理的,让我们看看下一个字符:

 [a][+][+][] 

“将后增加variablesa” – 这是有道理的,让我们看看下一个字符,

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

这根本不符合逻辑。 我有两个expression式(a ++)和(b),它们之间没有中缀运算符。

如果你使它成为a+ +b它不会find++运算符,它将作为a + + b

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

parsing器将从左侧开始,在“a + + b”的情况下(由于它们之间的空白),将会生成+,+和b分离的标记。 在“a ++ b”的情况下,它将应用最长匹配规则,并将创build一个++&b作为标记。 a ++ b作为一个expression式没有任何语义意义,因此它不会被编译。

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

虽然它不是Javascript,但C ++与+和++运算符有相似的乐趣。 这是从一个回顾当时的一周大师调查。