首页 > 解决方案 > 为什么加号和一元加号在数组语法中表现奇怪?

问题描述

加号运算符的这个问题之后,我有一个后续问题。plus我们知道and之间的区别uplus,因此可以1+2解析为3, just as 1++2or even 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

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

因此我的问题是:为什么做[1 ++ 2][1 + + 2]解决不同?

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

标签: arraysmatlabparsingunary-operator

解决方案


我怀疑这与数字文字的解析方式有关。特别是,请考虑以下复杂示例:

>> [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一个“复杂”数字。


来自@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 将他们的解析器开源或记录在案之前,我们只能猜测。


推荐阅读