我正在摆弄不同的东西,比如这个
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
无效?
答案 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++ b
或a ++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之一的时候进行调查的。