Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从嵌入式C/C+中去掉goto语句+;逻辑_C++_C - Fatal编程技术网

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

C++ 从嵌入式C/C+中去掉goto语句+;逻辑,c++,c,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; }

我想摆脱这个
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:
…;
int结果[i][j];

for(int i=0;i使用布尔值与for循环断开

int结果[i][j];
bool cont=1;

对于(int i=0;i我将看到三种可能的解决方案

  • 将代码放入函数中,并将该函数保留为
    return
  • 使用一个“完成”的旗帜,就像米歇尔·凯伊泽斯、巴斯因·赫特·费尔德和埃维蒂奇在回答中所展示的那样
  • (仅限C++版本)在代码部分周围使用try-catch块,并在您想要离开代码时抛出和异常。但请记住,异常通常用于错误处理。因此,只有在错误条件导致循环终止时,才应使用此模式
  • int结果[i][j];
    
    对于(int i=0;i将这些循环放入一个函数中,给它一个正确的名称,完成后返回;
    。如果它足够复杂,需要两个循环,那么它应该有一个名称

    finished标志很难读取,因此无论如何都应该将该构造放在它自己的函数中,使其过时


    异常仅适用于您无法在本地处理的错误。使用它们来通知更高级别的函数您无法修复的错误,而不是在本应发生的错误发生时。由于您要中断两个循环,因此必须通知外部循环。您可以通过使用布尔值来检查:

    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;
    }
    
    bool break\u loop=false;
    对于(int i=0;i<100;++i){
    对于(int j=0;j<100;++j){
    如果(j==80){
    break_loop=true;
    打破
    }
    }
    if(break_loop)break;
    }
    
    我有时喜欢更改控制变量

    for(int i=0;i<100;i++){
    对于(int j=0;j<100;j++){
    /*工作*/
    如果(j==80)i=j=100;//100使两个循环终止
    }
    }
    
    int结果[i][j];
    
    对于(In i=0;我请选择一种语言,C和C++有不同的习语,不同的解决方案不一定是邪恶的。在复杂的流控制循环中,它可能是最有效的方法。使用一个变量,在每个循环级别上都可以被询问是一个经常被发现的解决方案。在我看来,Goto更清楚地做它应该做的:离开循环。!应该做的第一件事是简化嵌套循环,但如果这不是一种有用的方法,请继续使用简单、易于理解和清晰的goto!在本例中,您可以将(j=0;j<80;j++)
    的内部循环更改为
    。问题的更一般版本是什么?如果(j==函数),可能是
    吗(i,j)goto break 1;
    ?如果是这样,那么
    goto
    是合理的。否则你必须使用一个标志和
    break
    语句。(顺便提一下,
    goto
    不是一个“调用”;它是一个语句。)大概
    int result[i][j];
    应该是
    int result[100][100]
    异常?真的吗?OP要求嵌入代码。通常嵌入式系统有异常,RTTI关闭。我认为不应该使用异常来处理正常的中止条件。使用异常来处理异常的规模更大!异常应该只用于…异常,在这种情况下,似乎(或者可能是)发现了一些不属于例外的东西。带有goto的代码对我来说很容易阅读。如果您的更改是解决方案,我希望返回我的问题:-)如果实际代码中存在
    continue
    ,则此操作将失败。break语句是否可编译?misra也不会容忍嵌入的
    return
    语句。他们会倾向于使用finished标志。我同意你的看法,这将是一个可怕的解决方案,修复效果比problem@chqrlie我不知道米斯拉,但如果是VOR是函数上方的标志,这在我看来确实很愚蠢。什么样的系统不支持
    返回
    语句?他们坚持在函数体的末尾有一个
    返回
    语句。我们现在已经看到了十几种对抗goto的解决方案。我相信,goto在所有情况下都比所有的这里的“解决方案”中显示的代码。“Goto是坏的”可能会导致我们看到的更糟糕的代码。在工作中,我们有编码规则,不允许修改循环本身内部的控制/循环变量。我认为这和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)
            {
               i = 100;
               break;
            }
        }
    }
    
    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 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;
    }