从嵌入式C / C ++逻辑中删除goto语句

时间:2015-03-05 16:10:08

标签: c++ c

我想摆脱这个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:
…;

7 个答案:

答案 0 :(得分:4)

将这些循环放在一个函数中,给它一个正确的名称,并在完成时return;。如果它足够复杂,需要两个循环,那就值得一个名字。

一个完成的标志很难读,所以你应该将该结构放在它自己的函数中,使其过时。

例外仅适用于您无法在本地处理的错误。使用它们通知更高级别的功能,你无法修复的东西出错,而不是发生了应该发生的事情。

答案 1 :(得分:2)

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

  1. 将代码放入函数中,并将该函数保留为return
  2. 使用“已完成”的标志,就像已经在Michel Keijzers的答案中所展示的那样,在Feld和EvilTeach中的Bas。
  3. (仅限C ++)使用try-catch-block包围代码段,并在您想要保留代码时抛出异常。但请记住,异常通常应该用于错误处理。因此,在终止循环时,只应使用此模式是错误条件的结果。

答案 2 :(得分:1)

使用布尔值从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;

(注意:未在真实编译器上测试过)。

答案 3 :(得分:1)

由于你想要打破两个循环,你必须通知外部循环。你可以通过一个检查它的布尔值来做到这一点:

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;
}

答案 4 :(得分:0)

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;
        }
    }
}

答案 5 :(得分:0)

我有时喜欢更改控制变量

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
    }
}

答案 6 :(得分:0)

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;
}

知道这是一个老问题,但是可以简单地修改