繁体   English   中英

for循环范围语法

[英]for loop range syntax

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

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循环语法? 是否有一些它应该变得更容易? 只是好奇是否有人对此有任何想法。 谢谢。

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,编辑器会警告您的代码中存在各种问题 注意右边框中的小红色破折号可以为你节省几个小时的调试时间(但也许你正在使用八度音阶)。 我试图养成一个习惯来修复它所表示的所有警告。 对于您的代码,它显示以下内容:

编辑截图

你的代码相当于

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM