在特定场景中等效于Java中的c ++ goto

时间:2011-07-11 12:09:31

标签: java c++

我用Java替换旧的C ++代码:我知道java中没有相应的goto,因为它会导致许多令人惊讶的错误和意外的循环终止。

C ++代码://我已跳过实际代码

for(//some condition){

  if (excl(grds[i],0)) 
   {
       //do something 
       goto breakout;
   }
   //some more code
breakout:
   //rest of the code
}//end of for loop

Java表示:

for(//some condition){

  if (excl(grds[i],0)) 
   {
      //do something 
   }
  else
   {
   //some more code
   }

   //rest of the code
}//end of for loop

我在else部分保留了“更多代码”部分,所以我猜它的功能与突破相同。当if条件为真时,它不会转到else部分,其余的代码将照常执行。我想中断或继续不会达到目的,因为我们需要以任何方式运行所有迭代的代码部分的其余部分。

这是用Java表示这个C ++代码的正确方法吗?

7 个答案:

答案 0 :(得分:2)

是的,这将是更好的方式 - 在Java和C ++中。

答案 1 :(得分:1)

for(//some condition){

  if (!(excl(grds[i],0))) 
   {
      //some more code
   }

   //rest of the code
}//end of for loop

修改:在您澄清之后,您的方式很好。

为什么你不能这样呢?

在C ++代码中,//some more code仅在条件为false且始终执行//rest时执行。所以把它放在if。

答案 2 :(得分:1)

这可能是最简单的方法:

for(//some condition){

   if(!excl(grds[i],0)) 
   {
      //some more code
   }

   //rest of the code
}//end of for loop

你真的不应该在C ++中使用goto。作为旁注,在Java中,您可以使用可用于模拟goto的命名块:

namedBlock:
{
    // some code

    if(condition)
        break namedBlock;

    // some more code
}
// rest of the code

但这是非常糟糕的做法。不要这样做。忘了我甚至提到过它;)

答案 3 :(得分:0)

更确切地说,这也是正确的在C ++中表示代码的最佳方式。为什么要使用goto而不是简单的if

答案 4 :(得分:0)

这是一个黑客

for(//some condition){
    do { // note this *do* 
        if (excl(grds[i],0)) 
        {
            break; // out of do/while
        }
        //some more code
    }
    while(false); // do only once

      //rest of the code
}//end of for loop

答案 5 :(得分:0)

我确信人们会因此而讨厌我,但你可以更接近Java中的goto语句而不是if / else示例。例如,你可以这样做:

for(/*some condition*/){
    breakout: {
        if (excl(grds[i],0)) {
           break breakout;  //this will jump to the end of the "breakout" block
        }

        //some more code
    }
    //rest of the code
}

当然,这不是一个好的Java编码风格的例子,只是因为这可以做到并不意味着它应该完成。你真的应该坚持使用if / else。

答案 6 :(得分:0)

在某些情况下,非常罕见的情况,使用goto是C ++中正确的选择。显示的示例不是其中之一。这是一个永远不应该使用的goto期。如果您可以消除goto而没有其他变量,则goto没有理由存在,不会增加复杂性。

在Java中可以很容易地消除C ++中goto的一些有效用法。

  • C和C ++没有办法打破或继续使用嵌套循环。 Java确实如此。如果goto的目标位于某个近大括号之前,请使用goto label更改continue label。 <{1}}的目标在一些近距离后立即时,请使用goto更改goto label。 (可能需要移动标签声明。)
  • 某些C ++代码使用break label代替goto进行本地错误处理/本地错误恢复。 C ++异常具有相当严重的性能损失。如果代码正在转换为Java,那么显然性能不是问题。对这种throw使用Java异常。