我花了几个小时调试一个我认为会出现语法错误的问题。
a = zeros(3);
for i=1:1size(a,2) % note the missing colon between 1 and size(a,2)
i
end
以下仅显示
ans = 3
1
基本上,似乎Matlab / Octave将上述内容解析为:
for i=1:1
size(a,2)
i
end
但请注意
i=1:1size(a,2)
产生语法错误。有没有一个很好的理由Matlab / Octave有这个for循环语法?是否有一些它应该变得更容易?只是好奇是否有人对此有任何想法。感谢。
答案 0 :(得分:4)
Matlab的语法允许这一点确实有点令人惊讶。我不知道为什么这是允许的。一个原因可能是在一行上允许for循环:
>> for i=1:3 disp(i);end
1
2
3
但有趣的是,不允许删除空格:
>> for i=1:3disp(i);end
for i=1:3disp(i);end
|
Error: Unexpected MATLAB operator.
这个原因可能是d
之后的数字是编写浮点数(3d10 == 3e10
)的另一种方式,所以解析器/标记器最初认为你定义了一个数字,但是看到i
时会感到困惑。 Daniel的fprintf
示例确实有效,因为后跟f
的数字不是有效数字,因此tokenizer会理解您启动了一个新令牌。
我想多年前(> 30?),当他们定义matlab的语法时,他们没有预见到这会引入这种难以发现的问题。我猜matlab最初是由工程师为工程师编写的,而不是由知道如何设计通用编程语言的人编写的。其他语言(如C或Python)使用标点符号将循环条件与循环体分开,因此没有歧义。我不知道是否仍然可以纠正Matlab的语法,因为它可能会破坏依赖于当前行为的旧代码。
至少,如果您使用最新版本的Matlab,则代码中的编辑器warns for various problems。注意右边框中的小红色破折号可以为你节省几个小时的调试时间(但也许你正在使用八度音阶)。我试图养成一个习惯来修复它所表示的所有警告。对于您的代码,它显示以下内容:
答案 1 :(得分:1)
您的代码等同于
a = zeros(3);
for i=1:1
size(a,2)
i
end
在某些地方,每个人都会使用换行符或空格,但解析器本身并不需要。
最小循环:
for i=1:3fprintf('%d',i),end
但我建议至少使用逗号分隔版本,其他一切都很难读:
for i=1:3,fprintf('%d',i),end