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