天天看點

C++ 中使用 goto 增強 break 和 continue

C++ 的 goto 語句在大多數時間是被打入冷宮的,就因為它容易使代碼晦澀難讀。同時,break 和 continue 又經常在多重循環中黔驢技窮——不能越層控制循環。

  相比之下,Java 就兼顧這兩種情況,将 goto 徹底禁用,而标簽則限制其隻能用于循環之前,以此增加 break 和 continue 的功能,使其能越層控制循環 [參閱:《帶标簽的 break 和 continue (Java)》]

  Java 尚能如此,為何不在 C++ 中用标簽和 goto 語句模仿 Java 來增強 break 和 continue 的功能呢?

  于是照 Java 代碼寫了一份 C++ 的試驗樣例,結果第一次試驗失敗。代碼如下:

  1. int main(int argc, char* argv[])  
  2. ...{  
  3.     cout << "[begin>" << endl;  
  4. continuei:  
  5.     for (int i = 0; i < 10; i++) ...{  
  6.         for (int j = 0; j < 5; j++) ...{  
  7.             if ((i + j) % 5 == 0) ...{  
  8.                 cout << "continue i" <<endl;  
  9.                 goto continuei;  
  10.             }  
  11.             cout << i << ", " << j << endl;  
  12.         }  
  13.     }  
  14.     cout << "<end]" << endl;  
  1. int main(int argc, char* argv[])  
  2. ...{  
  3.     cout << "[begin>" << endl;  
  4.     for (int i = 0; i < 10; i++) ...{  
  5.         for (int j = 0; j < 5; j++) ...{  
  6.             if ((i + j) % 5 == 0) ...{  
  7.                 cout << "continue i" <<endl;  
  8.                 goto continuei;  
  9.             }  
  10.             cout << i << ", " << j << endl;  
  11.         }  
  12. continuei: continue;  
  13.     }  
  14.     cout << "<end]" << endl;  
  1. int main(int argc, char* argv[])  
  2. ...{  
  3.     cout << "[begin>" << endl;  
  4.     for (int i = 0; i < 10; i++) ...{  
  5.         for (int j = 0; j < 5; j++) ...{  
  6.             if ((i + j) % 5 == 0) ...{  
  7.                 cout << "continue i" <<endl;  
  8.                 goto continuei;  
  9.             }  
  10.             if (i == 7 && j == 1) ...{  
  11.                 cout << "break i" << endl;  
  12.                 goto breaki;  
  13.             }  
  14.             cout << i << ", " << j << endl;  
  15.         }  
  16. continuei: continue;  
  17. breaki: break;  
  18.     }  
  19.     cout << "<end]" << endl;