For loop end语句可以替换八度音阶中的endfor语句吗?

For loop end语句可以替换八度音阶中的endfor语句吗?,for-loop,octave,For Loop,Octave,这说明我们应该使用endfor语句来关闭for循环的范围 但是用end替换它会导致相同的行为 使用end而不是endfor是否有任何意外的副作用?end与关闭for循环时的endfor同义 使用end的唯一副作用是,您的代码也将与MATLAB兼容,因为endfor是Octave发明的语言的扩展。我建议您不要使用endfor等(endif,endfunction,endswitch,endwhile)。实际上,我基本上同意Cris的答案,原则上我也遵循同样的建议。然而,我觉得有必要在这里扮演魔鬼代

这说明我们应该使用
endfor
语句来关闭
for
循环的范围

但是用
end
替换它会导致相同的行为


使用
end
而不是
endfor
是否有任何意外的副作用?

end
与关闭
for
循环时的
endfor
同义


使用
end
的唯一副作用是,您的代码也将与MATLAB兼容,因为
endfor
是Octave发明的语言的扩展。我建议您不要使用
endfor
等(
endif
endfunction
endswitch
endwhile
)。

实际上,我基本上同意Cris的答案,原则上我也遵循同样的建议。然而,我觉得有必要在这里扮演魔鬼代言人的角色,因为这听起来像是octave开发人员提供这些关键字的决定被误导了,而实际上有充分的理由,并且知道使用endfor的好处,endif允许您在何时以及为什么要避免这些关键字时做出明智的决定

请允许我用一个例子来证明它们的有用性:

function f(a)
    if a == 1
       disp('a == 1')
    else if a == 2
       disp('a == 2')
    else
       disp('a == 3')
    end
    disp('do some very important thing here that absolutely must be done always')
end
你能在这里发现微妙但致命的虫子吗

而如果您尝试运行此代码:

function f(a)
    if a == 1
       disp('a == 1')
    else if a == 2
       disp('a == 2')
    else
       disp('a == 3')
    endif
    disp('do important thing')
endfunction
octave会立即警告你有严重错误,它会阻止你射中自己的脚

在许多其他情况下,当simple
end
不能保护您时,endifs和endfors会保护您。而且,至少,它们提供了一个非常强大的视觉路标,指示您在代码中的位置(我是刚刚关闭for循环,还是刚刚退出if块)。特别是考虑到大多数学术代码的状态,通常是一堆未插入的意大利面代码,其中包含大量嵌套的
if
块,这些块在单个文件中持续数英里。如果您遵循良好的软件工程原则,使用干净、模块化、适当缩进的代码,那么通过编写
endfor
而不是
end
来增加额外的保护层可能是过分的。但这并不意味着他们没有理由去那里

但是,我同意,如果你想要matlab的兼容性,而且你可能想要,那么最好使用“稍微不太安全但最终兼容”的版本

讽刺的是,我经常发现自己编写的代码如下所示:

if something
  % large block of code here
end % if

只是为了与matlab兼容,但仍然要在视觉上清楚地表明刚刚关闭的块实际上是一个if块。

那么您已经回答了自己的问题?我不知道这两个块之间有什么区别吗?您应该将其添加到问题中。这是一个很好的论点。谢谢你分享你的观点!我认为linters应该能够避免这种错误,但你对大多数MATLAB/倍频程代码都是缩进不一致的学术意大利面的看法是100%正确的。@CrisLuengo是的,就像我说的,我是在扮演魔鬼代言人,在建议人们使用end vs endfor时,我实际上和你站在同一阵营,哈哈。(尽管如此,上面的bug不会被linter发现,因为它是一个逻辑bug,但在其他方面是完全有效的matlab代码)一个好的linter会发现函数嵌套与缩进不匹配。我不知道有没有任何Matlab LTENS关注这个问题,但是我的C++编辑器一定让我知道缩进是否是错误的。@ SuravaSuHu:在这个例子中,<代码>否则如果< /COD>启动新的<代码>如果语句。有两个
if
语句以
end
结尾。对于
函数
,没有
结束
,但这在MATLAB中是合法的。如果
@SauravSahu尝试使用f(1)运行函数,并查看是否发生了“应该总是发生的真正重要的事情”,则代码将使用
elseif
而不是
else:)