为什么“a + + b”有效,但“a ++ b”不起作用?

时间:2011-09-20 21:18:00

标签: javascript

我正在摆弄不同的东西,比如这个

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无效?

7 个答案:

答案 0 :(得分:57)

Javascript解析器是贪婪的(它每次匹配最长的有效运算符),因此它从++获取a++b运算符,使得:

(a++) b

无效。当您放入空格a + + b时,解析器会将其解释为:

(a) + (+b)

这是有效的,可以算是三个。

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

答案 1 :(得分:12)

正在阅读a++,然后遇到b并且不知道如何处理它。

答案 2 :(得分: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 :(得分:3)

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

实际上:

a = 1
b = 2;

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

1 3对JS代码的意义是什么?

答案 4 :(得分:3)

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

[a][][][][]

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

[a][+][][]

“将增加变量” - 这是有道理的,让我们看看下一个角色:

[a][+][+][]

“将增加变量a” - 这是有意义的,让我们看下一个字符,

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

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

如果您使用a+ +b,则无法找到++运算符,它将作为a + + b使用。

答案 5 :(得分:1)

这里有

Longest Match规则。它说解析器必须从左到右开始考虑最长的令牌(我假设Javascript的语法是从左到右)。所以,只需应用此规则,您就会得到答案。

Parser将从左侧开始,将生成a,+,+&amp; b在“a + + b”的情况下分开的标记(由于它们之间的空白区域)。在“a ++ b”的情况下,它将应用最长匹配规则,并将创建一个++&amp; b作为代币。 a ++ b作为一个表达式没有任何语义意义,因此它不会被编译。

答案 6 :(得分:0)

答案是++既是运算符又是+,+ +是+ +运算符,而不是++运算符。

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