簡體   English   中英

特定場景下Java中c++的goto等價

[英]Equivalent of goto of c++ in Java in a specific scenario

我正在用 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 部分保留了“更多代碼”部分,所以我猜它會 function 與突破相同。 當 if 條件為真時,它不會 go 到 else 部分,代碼的 rest 將照常執行。 我猜 break 或 continue 不會達到目的,因為我們需要以任何方式運行代碼部分的 rest 以進行所有迭代。

這是在 Java 中表示此 C++ 代碼的正確方法嗎?

是的,這將是更好的方法 - 在 Java 和 C++ 中。

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中。

這可能是最簡單的方法:

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

但這是一種糟糕的做法。 不要這樣做。 忘了我什至提到過它;)

是的。

更准確地說,這就是正確的在 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。

在某些情況下,非常罕見的情況下,使用goto正是 C++ 中的正確選擇。 所示示例不是其中之一。 這是一個不應該被使用的goto ,期間。 如果您可以在不增加變量、不增加復雜性的情況下消除goto ,則goto存在的理由為零。

C++ 中goto的一些有效用法可以在 Java 中輕松消除。

  • C 和 C++ 無法中斷或繼續跳出嵌套循環。 Java 可以。 goto的目標緊接在某個右大括號之前時,將goto label更改為 continue continue label goto的目標緊跟某個右大括號之后時,將goto label更改為break label (label 語句可能需要移動。)
  • 一些 C++ 代碼使用goto代替throw來進行本地錯誤處理/本地錯誤恢復。 C++ 異常具有相當嚴重的性能損失。 如果代碼正在轉換為 Java 很明顯性能不是問題。 對這種 goto 使用goto異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM