在特定场景中,相当于Java中c++的goto

Equivalent of goto of c++ in Java in a specific scenario

本文关键字:Java c++ goto 相当于      更新时间:2023-10-16

我正在用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

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

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

是的,那样会更好—在Java和C++中。

这可能是最简单的方法:

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

但这是一种糟糕的做法。别这么做。忘了我曾经提到过;(

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.

是。

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

这是一个破解

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

我相信人们会因此讨厌我,但与if/else示例相比,您可以更接近Java中的goto语句。例如,你可以做:

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。

在某些情况下,非常罕见的情况下,在C++中使用goto正是正确的选择。所示的示例不是其中之一。这是一个永远不应该使用的goto,句号。如果可以在不增加变量、不增加复杂性的情况下消除goto,那么goto就没有存在的理由。

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

  • C和C++没有中断或继续嵌套循环的方法。Java的确如此。当goto的目标正好在某个右大括号之前时,将goto label更改为continue label。当goto的目标在某个右大括号后立即时,将goto label更改为break label。(标签语句可能需要四处移动。(
  • 一些C++代码使用goto代替throw进行本地错误处理/本地错误恢复。C++异常会带来相当严重的性能损失。如果代码正在转换为Java,那么性能显然不是问题。对这种goto使用Java异常