【问题标题】:Are matlab function parameters evaluated in order, from left to right?matlab 函数参数是否按从左到右的顺序进行评估?
【发布时间】:2016-05-23 11:07:02
【问题描述】:

下面的代码定义好了吗?

print_factor(p(++k), p(--k));

八度音阶中的事物是什么样子的?

【问题讨论】:

  • x++ 在 MATLAB 中是无效语法。
  • 这不是 MATLAB 语法,我建议不要在 Octave 中使用它,因为你会扼杀与 MATLAB 的兼容性而没有真正的优势。

标签: matlab octave operator-precedence


【解决方案1】:

不要这样做!该代码在 MATLAB 和 Octave 中都有效,但行为却大不相同。


MATLAB:

您拥有的代码实际上是有效 MATLAB 代码。但是,它并没有达到您的预期。

在许多语言中,++k 表示递增 k 并返回它。在 MATLAB 中,++k 与 k 相同,因为在 MATLAB 中:3 == +3 == ++3 == +++++++3。 --k 也是如此。这是--k == -(-k) == +k == k。类似地,在许多语言中k++ 意味着返回k,然后递增它。然而,在 MATLAB 中,k++ 和 k-- 的语法无效并导致语法错误。

您的代码(在 MATLAB 中)相当于:

print_factor(p(k), p(k));

使用p 和print_factor 的两个示例函数在MATLAB 中测试代码:

p = @(x) 2*x;
print_factor = @(x,y)disp([x,y]);
k = 2;
print_factor(p(++k), p(--k));
 4     4
k    
k =    
     2

八度:

在 Octave 中,定义了运算符,并从左到右进行评估,但我认为关于增量运算符的 official documentation 并没有说明这一点。它可能依赖于平台,就像在 C++ 中一样。但是,它可能会以与其他表达式的评估相同的方式进行解释,请参见底部的示例。

你可以在线测试here。

Octave 中完全相同的代码:

p = @(x) 2*x;
print_factor = @(x,y)disp([x,y]);
k = 2;

print_factor(p(++k), p(--k));
   6   4
k
k =  2

print_factor(p(++k), p(++k));
   6   8
k
k =  4    

正如 Dan 评论的:在 Octave 中编写不遵循 MATLAB 语法的代码不是一个好主意。如果您想在 MATLAB 中运行它,则必须重写它。

【讨论】:

  • 我不会说这是一个有效的代码,而是一个无法引发错误的解析器错误。
  • 嗯?在 MATLAB 中?为什么?你会考虑:k = -3; p(-k); 也无效吗?
  • 我的意思是 p(++++++k) 有效是错误的。
  • 这一点也不奇怪。 - 运算符在变量前面使用时是一元运算符。这意味着---3 == -(--3) == -(-(-3)) == -(-(-(3)))。如果 JIT(或者这实际上可能在静态代码分析中完成?)可以理解这一点,它将对第一个表达式进行操作,该表达式返回一个 r 值,第二个一元减号对其进行操作,......等等.非常自然:)。
  • @patrik 这对解析器过于信任了。那只是错误的编码。如果 matlab 具有就地替换解析习惯并扩展所有嵌套组,那将是 OKish。但在高层拥有这个只是添加口红。请注意,它与具有相同心态的k----- 不一样
猜你喜欢
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2018-11-05
  • 2011-06-09
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多