我有一个非常大的循环,循环1000行。如果找到魔术值1,我退出循环。如果未找到魔法值1但发现魔法值2,则循环需要跳到开头。现在我正在使用一个开关,一些ifs和一个goto。我读过goto不是最好的方法。有没有更好的方法来使这项工作?
答案 0 :(得分:17)
要退出循环,您可以使用break语句转到下一条记录,您可以使用continue语句。
for(int i = 0; i < 1000; i++)
{
if(magicValue1)
break;
if(magicValue2)
continue;
}
我没有考虑使用GOTO声明我只是简单地指出了可能的使用案例
您可以使用转到跳转语句来启动/退出循环,但是除非您使用嵌套循环,否则我会远离此选项。我认为goto语句仍然有用于优化,干净利落等等。但总的来说,最好是谨慎使用相当。
for(int i = 0; i < 100; i++)
{
start:
for(int i = 0; i < 10; i++)
{
if(magicValue1)
goto end;
if(magicValue2)
goto start;
}
}
end :
答案 1 :(得分:10)
这个怎么样:
for(int i = 0; i < 1000; i++) {
if(values[i] == MAGIC_VALUE_1) {
break;
} else if(values[i] == MAGIC_VALUE_2) {
i = 0;
}
}
如果“跳到开头”表示“跳过此记录并处理下一条记录”,请将i = 0
替换为continue
。
答案 2 :(得分:3)
while
变体没有break
:
bool continue = true; int i = 0;
while (i < 1000 && continue){
if(values[i] == MAGIC_VALUE_1) {
continue=false;
} else if(values[i] == MAGIC_VALUE_2) {
i = 0;
}
i++;
}
答案 3 :(得分:2)
我还不能发表评论(1个代表点)
但这不会更好:
for (int i = 0; i < 1000; i++)
{
if (magicValue1)
{
break;
}
else if (magicValue2)
{
dosomething();
i=0;
}
}
我不确定“重启搜索”是什么意思。
答案 4 :(得分:1)
我正在考虑#2的情况意味着你不想在#2情况下执行(即跳过)循环体而不是你想要将循环重置为0.(如果我',请参阅代码注释我得落后了。)
这个建议可能会引起争议,因为for循环中较不常见的条件可以说在自我记录的规模上较低,但如果这不打扰你,那么写一个简洁的方式来写我认为你的内容想要的是:
for (int i= 0; i<values.Length && values[i]!= MAGIC_1; i++)
{
if (values[i] == MAGIC_2)
{
// Don't do the loop body for this case but continue on looping
continue;
// If you want to reset the loop to zero instead of skip the 2 case,
// comment-out the continue; and un-comment the line below:
// i=0;
}
// Do long loop body here
}
答案 5 :(得分:1)
请注意,如果您将MagicValue设置为2时将计数器设置为0,并且您的代码永远不会更改值,那么您可能会处于无限循环中。
答案 6 :(得分:0)
更复杂的可能是:
我们定义了2种扩展方法。
public static class Extensions
{
public static bool isMagic_1(this int i)
{
return i == 1;
}
public static bool isMagic_2(this int i)
{
return i == 2;
}
}
现在你可以这样做:
for(int i = 0; i < 1000; i++)
{
if(i.isMagic_1())
break;
if(i.isMagic_2())
continue;
}
希望这有帮助!