9

我花了几个小时调试一个我认为是语法错误的问题。

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 循环语法有充分的理由吗?有什么东西应该让它变得更容易吗?只是好奇是否有人对此有任何想法。谢谢。

4

2 回答 2

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确实有效,因为后跟 an 的数字f不是有效数字,因此标记器知道您启动了一个新标记。

我猜很多年前(>30?),当他们定义matlab的语法时,他们没有预见到这会引入这种难以发现的问题。我猜 matlab 最初是由工程师为工程师编写的,而不是由知道如何设计通用编程语言的人编写的。其他语言如 C 或 Python 使用标点符号将循环条件与循环体分开,因此没有歧义。我不知道是否仍然可以更正 Matlab 的语法,因为它可能会破坏依赖于当前行为的旧代码。

至少,如果您使用最新版本的 Matlab,编辑器会针对您的代码中的各种问题发出警告。注意右侧边框中的红色小破折号可以为您节省几个小时的调试时间(但也许您使用的是八度音程)。我试图养成修复它指示的所有警告的习惯。对于您的代码,它显示以下内容:

编辑器截图

于 2013-11-13T18:48:36.460 回答
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
于 2013-11-13T17:36:16.437 回答