Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “为什么?”;a和x2B+;b";工作,但是;a和x2B+;b";不';T_Javascript - Fatal编程技术网

Javascript “为什么?”;a和x2B+;b";工作,但是;a和x2B+;b";不';T

Javascript “为什么?”;a和x2B+;b";工作,但是;a和x2B+;b";不';T,javascript,Javascript,我在摆弄不同的东西,像这样 var a = 1, b = 2; alert(a + - + - + - + - + - + - + - + b); //alerts -1 我可以移除这些空间,它仍然可以工作 a+-+-+-+-+-+-+-+b 然后我试着 a + + b 它运行并计算为3,但当我删除空格时,(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
不起作用?

它在读
a++
,然后它遇到了
b
,不知道该怎么处理它。

这是一元运算符的不同之处

"a + + b" is the same as "a + (+b)"
"a++b"    is the same as "(a++) _ b"  <--- there is a missing operator where the _ is
“a++b”与“a+(+b)”相同

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

(a++) b
这是无效的。当您在空格
a++b
中添加空格时,解析器将其解释为:

(a) + (+b)
这是有效的,结果是三


有关详细信息,请参阅上的这篇Wikipedia文章。

Javascript的
++
增量运算符的运算符前置规则没有左右关联性。这意味着
a++b
可以解释为
a++b
a++b
,具体取决于具体的实现。不管怎样,这都是一个语法错误,因为有两个变量,一个一元运算符,两个变量之间没有任何连接

实际上:

a = 1
b = 2;

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

13
作为JS代码意味着什么

大多数编程语言解析器试图获取最长的有意义的文本块,因此当Javascript看到:

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

[a][+][][]
[a][+][+][]
“将添加到变量a”-这很有意义,让我们看看下一个字符:

[a][+][][]
[a][+][+][]
“will post increment variable a”-这很有意义,让我们看看下一个字符

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

如果将其设置为
a++b
,它将找不到
++
运算符,并且它将作为
a++b

规则在此处显示。它说解析器必须考虑从左到右的最长标记(我假设Javascript的语法是从左到右的)。所以只要应用这个规则,你就会得到你的答案


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

答案是++是一个运算符,也是+,并且++是两个+运算符,不是++运算符


<>虽然不是JavaScript,C++与+和++操作符有着相似的乐趣。这是从一开始就被调查过的。

我猜它与a++冲突,a++是有效的synax,或++b。它也可以被解释为(a++)b或a(++b)…额外的信用:为什么
a+++b
工作?(你现在应该有足够的信息来回答这个问题)我认为这是关键的答案:解析器是贪婪的。如果它不是贪婪的,它将是非常无用的“a++”将被解释为“a++”,这是非法的。其中一个重要的洞察是,在弄清楚这些令牌的含义之前,先要弄清楚输入包含哪些令牌。所以“++”将成为“++”标记,即使该标记在该上下文中无效。