为什么加号和一元加号在数组语法中表现得很奇怪?

Adr*_*aan 7 arrays matlab parsing unary-operator

上加上运营商这个问题,我有一个跟进的问题.我们知道之间的区别plusuplus,因而认为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
Run Code Online (Sandbox Code Playgroud)

同样适用于多个加号[1 +++..+++ 2],因此在中间连续生成[1 2]所有加号时,所有其他组合(据我测试)都会产生3.

据我所知,空间在MATLAB中的重要性有限; exp(3*x/y)是一样的exp( 3 * x / y ).它们在创建数组时有用:[1 2]将生成1- by- 2数组,还有一些其他用途,但分离运算符不是其中之一.

因此,我的问题是:为什么要这样做[1 ++ 2]并以[1 + + 2]不同

请注意,minus并且uminus具有相同的行为,并且解析器足够神奇,可以[1;;;3++ + + +--+ + ++4,;;;,;]完美地解析[1;7].

And*_*eak 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
Run Code Online (Sandbox Code Playgroud)

作为数组分隔符的空间与作为复数的一部分的空间之间存在冲突.

我相信解析器是这样编写的,它试图尽可能合理地理解复数(与复杂数组相比).在解析涉及加/减和空格的表达式时,这很容易导致非平凡的行为.


更具体一点:

1 ++ 2可能会解析为1 +2,因为多个一元加号仍然是一元加号,而一元加号只能作用于2.

但是1 + + 2可能会解析1 + (+ 2)后者加上作为一元加号消耗的情况,留下1 + 2哪个是单个"复杂"数字.


@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].一些伪随机测试似乎验证了这种行为.

当然,直到The MathWorks使他们的解析器开源或记录我们只能猜测.