这是在C或Perl中终止for循环的适当方法吗?
我在代码库中看到了一段类似的perl代码,我想知道这(设置这是在C或Perl中终止for循环的适当方法吗?,c,perl,coding-style,C,Perl,Coding Style,我在代码库中看到了一段类似的perl代码,我想知道这(设置I=100)是否是摆脱for循环的好方法?这有什么陷阱吗 int a[100]; ... bool check_if_array_contains_29() { bool result = false; for(int i=0; i<100; ++i) { if(a[i] == 29) { result = true; i =
I=100
)是否是摆脱for循环的好方法?这有什么陷阱吗
int a[100];
...
bool check_if_array_contains_29()
{
bool result = false;
for(int i=0; i<100; ++i)
{
if(a[i] == 29)
{
result = true;
i = 101;
}
}
return result;
}
inta[100];
...
bool检查数组是否包含
{
布尔结果=假;
对于(int i=0;i循环中的break
或简单地return true
有什么问题?它清楚地传达了意图,不依赖于循环条件。为什么不这样做:
bool check_if_array_contains_29()
{
for(int i=0; i < 100; ++i)
{
if (a[i] == 29)
return true;
}
return false;
}
bool检查\u数组是否包含\u 29()
{
对于(int i=0;i<100;++i)
{
如果(a[i]==29)
返回true;
}
返回false;
}
编辑:
我知道有些人觉得多个返回语句非常可怕,应该不惜一切代价避免,但对我来说,在一个方法中使用多个返回语句会使代码更容易阅读和理解
编辑2:
附加版本,以便如果方法需要有一些副作用或执行一些附加操作,可以使用break语句,或者可以调整for循环条件,或者可以添加一些标签和一些goto
bool check_if_array_contains_29_take2()
{
bool result = false;
for (int i=0; i < 100; ++i)
{
if (a[i] == 29)
{
result = true;
break;
}
}
// Do Other Stuff
return result;
}
bool check_if_array_contains_29_take3()
{
bool result = false;
for (int i=0; !result && i < 100; ++i)
{
result = a[i] == 29;
}
// Do Other Stuff
return result;
}
// Special edition for those who can't get enough goto
bool check_if_array_contains_29_and_do_more_stuff_without_early_return()
{
bool result = false;
for (int i=0; i < 100; ++i)
{
if (a[i] == 29)
{
result = true;
break;
}
}
if (!result)
goto error;
// Do some other stuff in the code here
goto done;
done:
return result;
error:
result = false;
goto done;
}
bool检查\u数组是否包含\u 29\u take2()
{
布尔结果=假;
对于(int i=0;i<100;++i)
{
如果(a[i]==29)
{
结果=真;
打破
}
}
//做其他事情
返回结果;
}
bool检查数组是否包含take3()
{
布尔结果=假;
对于(int i=0;!result&&i<100;++i)
{
结果=a[i]==29;
}
//做其他事情
返回结果;
}
//特别版为那些谁不能得到足够的转到
bool检查\u数组\u是否包含\u 29\u和\u执行\u更多\u内容\u而不提前\u返回()
{
布尔结果=假;
对于(int i=0;i<100;++i)
{
如果(a[i]==29)
{
结果=真;
打破
}
}
如果(!结果)
转到错误;
//在这里的代码中做一些其他的事情
去做;
完成:
返回结果;
错误:
结果=假;
去做;
}
正确的方法是使用C中的break
指令或Perl中的last
int a[100];
...
bool check_if_array_contains_29()
{
bool result = false;
for(int i=0; i<100; ++i)
{
if(a[i] == 29)
{
result = true;
break;
}
}
return result;
}
inta[100];
...
bool检查数组是否包含
{
布尔结果=假;
对于(int i=0;i使用break
:
bool check_if_array_contains_29()
{
bool result = false;
for(int i=0; i<100; ++i)
{
if(a[i] == 29)
{
result = true;
break;
}
}
return result;
}
bool检查\u数组是否包含\u 29()
{
布尔结果=假;
对于Perl中的(inti=0;i,您可以使用(可能带有标签)提前退出循环
要查找数组@x
中第一个出现的29,请使用:
我想不出对循环变量的愚蠢赋值有什么技术上的缺陷,但它是一个总的WTF,让阅读代码的人感到困惑是一个相当严重的缺陷。在C中,您可以使用break
,它退出最小的循环(指令所在的循环):
但在您的情况下,您只需退出整个功能:
for(...) {
if (a[i] == 29)
return true;
}
你不应该把&&!result
放在循环条件中吗?C和Perl之间唯一的区别是Perl使用last
而不是break
。是的,这是正确的。我会解决这个问题。我甚至不会开始谈论C和Perl的这种奇怪的比较。)在Perl中,这个任务很容易用一行代码就解决了(就像标量grep{$\u==29}@arr
),为什么要使用一些奇怪的退出点呢?标量grep{$\u==29}@arr
,至少在原则上,扫描整个数组(我不知道Perl解释器是否会优化它).谢谢..但是我看到的代码的真正功能更复杂..我只是简化了它来说明这一点(提前返回)…同意,这看起来太棒了。LLVM项目的编码标准特别建议提前返回,因为在长函数中,它清楚地表明不再进行处理,而不是强迫读者继续扫描以查看是否会发生任何处理。他们对为什么提前返回实际上是一个cl有很好的描述我知道这个问题是针对“C”的语言,但是在C++中,早期返回的资源分配陷阱被使用AutoTypTR或类似的方法覆盖。它是可怕的,中断和最后的语句是非常干净的,除了它在例子中工作的事实,但是如果你想用这个值做其他事情,那不是事实…但是在一般情况下,也许函数没有在THA完成。t点,break
可能是首选。正如Matt Ball提到的,它清楚地表明了意图,并且不会导致执行不必要的条件测试。@Rafael-你的声明是一个意见和偏好问题。正如我提到的,LLVM项目,可能会让你大吃一惊,在他们的编码中有一个非常好的描述关于为什么应该优先选择提前回报的标准。
my $i = first_index { $_ == 29 } @x;
$i > -1 or die "Cannot find 29 in array\n";
for(...) {
if (a[i] == 29) {
result = true;
break;
}
}
for(...) {
if (a[i] == 29)
return true;
}