arrays - 为什么加号和一元加号在数组语法中表现奇怪?
问题描述
在加号运算符的这个问题之后,我有一个后续问题。plus
我们知道and之间的区别uplus
,因此可以1+2
解析为3
, just as 1++2
or 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]
解决不同?
请注意,minus
anduminus
具有相同的行为,并且解析器足够神奇,可以[1;;;3++ + + +--+ + ++4,;;;,;]
完美解析到[1;7]
.
解决方案
我怀疑这与数字文字的解析方式有关。特别是,请考虑以下复杂示例:
>> [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 将他们的解析器开源或记录在案之前,我们只能猜测。
推荐阅读
- google-cloud-platform - Vault GCP 项目级角色绑定
- c# - 如何将表中的 1 个 id 字段连接到 2 个不同的表列
- javascript - 查找所有可能的数字组合以获得给定的总和 - Python 到 Nodejs
- database - 将 svn 补丁系统转换为 git
- python - 在 Python 中切换 AWS 账户 - EC2 对象没有属性“实例”错误
- typescript - .d.ts 文件可以使用“import XXX”导入,但默认导出不存在
- c# - 在网站和 Windows 服务项目之间共享实体数据模型
- c# - 实例化后如何立即调用方法
- javascript - 在javascript中创建一个带有方法的类
- html - 卡内的 Bootstrap 4 表存在问题