在this question on the plus operator之后,我有一个后续问题。我们知道plus
和uplus
之间的区别,因此1+2
解析为3
,就像1++2
甚至是1++++++++2
一样。奇怪的事情发生在数组语法中,请考虑以下示例:
>> [1 ++ 2]
ans =
1 2 % Two unary plusses
>> [1 + + 2]
ans =
3 % A normal plus and a unary one
>> [1++2]
ans =
3 % A normal plus and a unary one
相同的方法适用于多个加号[1 +++..+++ 2]
,因此,如果所有加号在中间连续产生[1 2]
,则所有其他组合(据我测试)均为3
。 / p>
据我所知,空间在MATLAB中的重要性有限; exp(3*x/y)
与exp( 3 * x / y )
相同。它们在创建数组中有一个用途:[1 2]
会生成1个 by- 2数组,还有其他一些用途,但分隔运算符不是其中之一。 / p>
因此,我的问题是:[1 ++ 2]
和[1 + + 2]
为何解析不同?
请注意,minus
和uminus
的行为相同,并且解析器的魔力足以将[1;;;3++ + + +--+ + ++4,;;;,;]
解析为[1;7]
。 em>
答案 0 :(得分:5)
我怀疑这与数字文字的解析方式有关。特别是,请考虑以下复杂的示例:
>> [1+2i]
ans =
1.0000 + 2.0000i
>> [1 +2i]
ans =
1.0000 + 0.0000i 0.0000 + 2.0000i
>> [1 + 2i]
ans =
1.0000 + 2.0000i
作为数组分隔符的空间与作为复数一部分的空间之间存在冲突。
我相信解析器的编写应使其尽可能合理地理解复数(相对于复数数组)。在解析涉及加/减和空格的表达式时,这很容易导致不平凡的行为。
更具体一点:
1 ++ 2
可能会解析为1 +2
,因为多个一元加号仍然是一元加号,并且一元加号只能对2
起作用。
但是1 + + 2
可以解析为1 + (+ 2)
,其中后者的加号被用作一元加号,而剩下的1 + 2
是单个“复杂”数字。
an inquisitive comment from @Adriaan之后的进一步跟进:
[...]
[1 ++ + 2]
是[1 2]
,但是[1 + ++ 2]
是3
所以我的正确猜测是解析器从右移到左。
[1 ++ + 2]
-> [1 ++ (+ 2)]
-> [1 ++ 2]
与[1 + ++ 2]
-> [1 + (++ 2)]
-> [1 + 2]
。这也意味着[1 + ...2]
的任何组合(在第一个相连的加号中只有一个加号)都会给您[3]
,而如果第一个加号中包含两个或多个您将得到[1 2]
。一些伪随机测试似乎可以验证这种行为。
当然,在MathWorks将其解析器开源或记录下来之前,我们只能猜测。