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会立即警告你有严重错误,它会阻止你射中自己的脚
在许多其他情况下,当simpleend
不能保护您时,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:)