从嵌入式C/C++逻辑中去掉goto语句

Get rid of goto statement from embedded C/C++ logic

本文关键字:goto 语句 嵌入式 C++      更新时间:2023-10-16

我想去掉这个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;。如果它足够复杂,需要两个循环,那么它应该有一个名字。

一个完成的标志很难阅读,所以无论如何都应该把这个构造放在它自己的函数中,使它过时。

例外情况仅适用于无法在本地处理的错误。使用它们来通知更高级别的函数无法修复的问题,而不是本应发生的事情。

我会看到三种可能的解决方案。

  1. 将代码放入函数中,并将该函数留给return
  2. 使用"完成"的旗帜,就像Michel Keijzers、Bas in het Feld和EvilTeach在回答中已经很好地展示的那样
  3. (仅限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,将导致外循环结束。