我有两段代码:
执行while循环:
do
{
errorflag=0;
...
if(cond1)
{
errorFlag=12;
break; // Error Conditions
}
.
. // Processing
.
if(cond2)
{
errorflag=56;
break;
}
.
.
} while (0);
转到标签:
errorflag=0;
if(cond1)
{
errorflag=12;
goto xy;
.
.
.
.
if(Cond2)
{
errorflag=56;
goto xy;
}
.
.
.
xy:
哪一个更好?请详细说明原因?或者有更好的方法吗?我们正在优化代码。我们最关注这些大循环。是装配级别,没有那么多的优化范围。请提供您的意见。
我不喜欢使用else - 如果从那以后,它再次成为检查一个条件的开销。所以当出现问题时直接退出。
我觉得在这次编辑后我的问题很有意义
提前致谢
答案 0 :(得分:13)
选项3:
void frobnicate(arguments)
{
if (cond1) return;
if (cond2) return;
...
}
frobnicate(the_arguments)
选择一个有意义的名字,并保持简短。
答案 1 :(得分:5)
它们生成相同的代码(假设编译器值得考虑),因此差异是其中一个最容易理解,do / while是否会干扰其他循环结构。如果存在此类干扰,请使用gotos。否则不要;他们不太清楚(通常)。
仔细观察你的功能是否过于复杂,应该重构为多个功能,目的更明确,控制流更简单。
答案 2 :(得分:3)
真的?你有没有听说过else
?
if (cond1)
{
//stuff
}
else if (cond2)
{
// more stuff
}
// etc
else
{
// default
}
修改强>
我误解了这个问题。我会在这里留下旧答案,因为这些评论对其他人来说没有意义。
根据问题的确切编码的正确方法是:
if (!cond1)
{
.
.
.
.
}
在问题的两种情况下,if (cond2)
部分都没有效果(假设cond2没有副作用),因为它们都会导致跳转到下一步将要执行的语句。这就是我把它遗弃的原因。
答案 3 :(得分:2)
答案 4 :(得分:-3)
goto
是邪恶的。只有在绝对没有办法执行此操作时,您才应该使用goto
。 goto
可能导致不可预测的意大利面条代码(难以阅读,理解,调试,很容易出现维护阶段的错误)。
我相信带有条件break
语句的无限while循环仍然更好,尽管当条件在while
语句中表达时它更具可读性。
答案 5 :(得分:-9)
根据您的问题,此处的选择为do-while
和goto
。
我建议您选择do-while
。
我不鼓励你使用goto
。这将导致你后来的意大利面条代码。
您可以使用if
和if-else
等替代方案来获得相同的结果。
对goto