为什么加号和一元加号在数组语法中表现出奇怪的现象?

时间:2018-10-05 11:08:49

标签: arrays matlab parsing unary-operator

this question on the plus 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

相同的方法适用于多个加号[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]为何解析不同?

请注意,minusuminus的行为相同,并且解析器的魔力足以将[1;;;3++ + + +--+ + ++4,;;;,;]解析为[1;7]。 em>

1 个答案:

答案 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将其解析器开源或记录下来之前,我们只能猜测。