为什么“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++ b
或a ++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 ++与+和++运算符有相似的乐趣。 这是从一个回顾当时的一周大师调查。