【问题标题】:Why are multiple, consecutive plusses allowable syntax in MATLAB?为什么在 MATLAB 中允许使用多个连续的加号语法?
【发布时间】:2018-09-28 12:47:53
【问题描述】:

有人知道为什么这在 MATLAB 中有效吗?

>> 1 ++ 2
ans =
     3

来自 C、python、Java 等的编码,我发现这完全可以工作是最违反直觉的。大概解析器有一些我不理解的重要内容?

【问题讨论】:

  • 1++++++++++2 也可以...
  • 1 ++ 2 = 1 + (+2) = 1 + 2 = 3... 这还能怎么解释呢?连续的+/- 符号没有歧义。请参阅unary plus(和一元减号)。
  • @JETM 类似的原因,是的,但是+++++ + + + 的工作方式与Java 不同,因为您需要在它们之间留有空格。
  • 若想获得更多乐趣,请比较 1 ++ 2[1 ++ 2]
  • @LuisMendo 这太疯狂了。 [1 ++ 2][1 2][1 + + 2]3 ... :'-( 谁能解释一下...

标签: matlab parsing syntax abstract-syntax-tree


【解决方案1】:

plusuplus 之间存在差异。我怀疑 MATLAB 将第一个 + 视为 plus,而其他所有的 uplus。由于uplus 默认情况下只是“返回后面的内容”,因此您添加了12,并在两者之间使用了很多“返回后面的内容”。

a=2;
c=+a % unitary plus
c =
     2
1+2 % addition
ans =
     3
1+++2 % addition and two uplusses
ans =
     3

uplus 存在的原因是允许类中的运算符重载。同样适用于其他语言,例如in C#,允许在受限类中重载运算符。


该 C# 线程中提到的另一个原因是将无符号短裤更改为整数,而 MATLAB 并非如此:

d=uint8(1)
d =
  uint8
   1
+d
ans =
  uint8
   1
a=+d
a =
  uint8
   1

不过,它确实将布尔值转换为双精度值,感谢 Cris Lunego 指出这一点:

+true
ans =
     1
+false
ans =
     0

然而,受Sanjay Manohar's comment的启发,以下内容对我来说仍然是个谜:

>> [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。我问了一个单独的问题:Why do the plus and unary plus behave strange in array syntax?

【讨论】:

  • 啊,是的,我真傻。似乎 ++ 并没有作为单个令牌使用。我想这意味着词法分析器和解析器在 Matlab 中不是独立的东西?我从来没有注意到这一点,而且它似乎不是语言之间很常见的特征?
  • @SanjayManohar 我不知道词法分析器或解析器是什么; ++ 不是,正如您对其他语言所期望的那样,“添加一个”。基本上,MATLAB 的解释器首先尝试使用加号作为加法,一旦这不起作用,它默认为一元加号,而后者又不对输入做任何事情。 MATLAB 不需要空格; 1*exp(i+3/5)1 * exp( i + 3 / 5 ) 一样有效
  • @Sanjay Manohar MATLAB 没有++ AFAIK,所以这里的词法分析器没有问题。
  • 对于那些感兴趣的人:Unarticulated plus 也将布尔值转换为双精度值:+true1.0(尽管这种转换也会发生在任何其他算术上下文中)。
  • @CrisLuengo 谢谢!但它不推广:class(+uint8(1)) 给了uint8
猜你喜欢
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
相关资源
最近更新 更多