从嵌入式C/C++逻辑中去掉goto语句
Get rid of goto statement from embedded C/C++ logic
我想去掉这个goto
语句。有谁能告诉我同样的逻辑吗。下面的代码不是我想要修改的确切代码,但它将支持我的问题。在评论这篇文章时,请不要问代码的重要性,因为它只是一个例子。
int result[i][j];
for (int i = 0; i<100; i++)
{
for (j = 0; j<100; j++)
{
result[i][j] = j++;
if (j == 80)
goto break1;
}
}
break1:
…;
把这些循环放在一个函数中,给它一个合适的名称,完成后给它return;
。如果它足够复杂,需要两个循环,那么它应该有一个名字。
一个完成的标志很难阅读,所以无论如何都应该把这个构造放在它自己的函数中,使它过时。
例外情况仅适用于无法在本地处理的错误。使用它们来通知更高级别的函数无法修复的问题,而不是本应发生的事情。
我会看到三种可能的解决方案。
- 将代码放入函数中,并将该函数留给
return
- 使用"完成"的旗帜,就像Michel Keijzers、Bas in het Feld和EvilTeach在回答中已经很好地展示的那样
- (仅限C++)用try-catch块包围代码部分,并在您想要离开代码时抛出和异常。但请记住,异常通常应该用于错误处理。因此,只有当终止循环是错误条件的结果时,才应该使用此模式
由于要中断两个循环,因此必须通知外部循环。你可以通过一个布尔值来检查这一点:
bool break_loop = false;
for (int i = 0; i < 100; ++i) {
for (int j = 0; j < 100; ++j) {
if (j == 80) {
break_loop = true;
break;
}
}
if (break_loop) break;
}
使用布尔值从for循环中断。
int result[i][j];
bool cont = 1;
for (int i =0;i<100;i++)
{
for(j = 0;j<100;j++)
{
result[i][j] = j++;
if(j == 80)
{
cont = 0;
break;
}
}
if (cont == 0)
break;
}
break1;
(注意:未在实际编译器上测试)。
我有时喜欢更改控制变量
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
/* work */
if (j == 80) i = j = 100; // 100 makes both loops terminate
}
}
int result[i][j];
for (int i = 0; i<100; i++)
{
int j;
for (j = 0; j<100; j++)
{
result[i][j] = j++;
if (j == 80)break;
}
if(j == 80) break;
}
知道这是一个老问题,但可以简单地修改
int result[i][j];
for (int i = 0; i<100; i++)
{
for (j = 0; j<100; j++)
{
result[i][j] = j++;
if (j == 80)
{
i = 100;
break;
}
}
}
break语句打破了内部循环。将i设置为100,将导致外循环结束。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 如何正确指定 goto 语句的标签?
- 使用 goto 语句C++块进行 python化
- 这是 c++ 中一个好的 goto 语句吗?
- 这段代码如何在没有任何循环语句或'goto'或递归的情况下循环?
- 如何在 lambda 表达式C++中使用 goto 语句
- C++ goto 语句执行而不调用
- 如何创建包含 goto 语句的主菜单函数
- 从嵌入式C/C++逻辑中去掉goto语句
- C++中goto语句对堆栈的影响
- 可以定义一个带有goto语句和标签的宏吗
- 替换goto语句
- 我如何用等价的结构化语句替换continue和goto语句
- 我应该在这里使用goto语句吗
- Java中有goto语句吗?
- 使用什么而不是Goto语句
- 多个返回语句或"goto end;"
- 与调用函数相比,goto语句效率高吗?