2014-04-09 114 views
4

我有非常簡單的代碼,我使用break內環內停止內循環和外循環:如何使用break語句

for (int it=0; it<5; it++) { 
    for (int it2=0; it2<5; it2++) { 
     if (it2==2) 
      break; //break here not it2, but it loop 
     NSLog(@"it=%d it2=%d", it, it2); 
    } 
} 

我收到的輸出:

it=0 it2=0, it=0 it2=1, 
it=1 it2=0, it=1 it2=1, 
it=2 it2=0, it=2 it2=1, 
it=3 it2=0, it=3 it2=1, 
it=4 it2=0, it=4 it2=1 

我知道在一些programic語言有可能確定哪些循環中斷語句應該影響。是否可以撥打break停止外部循環(forit變量)?

+0

在c或C++中,沒有。 break只用於當前循環 –

+2

在C語言中,你不能用直接指令(除了goto標籤)來完成它,但是你可以從第一個循環中斷開並設置一個標誌來打破第二個循環 – Coconop

+0

對於你的問題,你問它的方式,你有兩個選擇:'goto'或者一個函數。更有趣的問題是:你真正的問題是什麼(你提供的例子看起來很有意思),以及你想用哪種語言來解決它? –

回答

10

如果你真的想這樣做,那麼咬一口子,並使用goto

for (int it=0; it<5; it++) { 
    for (int it2=0; it2<5; it2++) { 
     if (it2==2) 
      goto end_outer_loop; 
     NSLog(@"it=%d it2=%d", it, it2); 
    } 
} 

end_outer_loop: 

// more stuff here. 

這是一個合法的goto(在向下方向最goto方法是)。事實上,break是一種特殊的「批准」轉到,因爲C是一種最小化的語言,你必須在複雜的情況下使用明確的轉到。

然而這裏很多人都指出,這是更好,如果你可以使用return.你不應該曲解你的程序,只是爲了避免轉到,但在大多數情況下,它是你的功能變得過於複雜的線索因此應該分手。

+1

'goto'不應該在這裏使用。這是一個功能的教科書用例。 –

+1

幫助!我有一個討厭的閃回到20世紀70年代 – ravenspoint

+8

把事情分解成更小的函數是很好的。但是你不應該這樣做*只是爲了避免轉向*。這真的取決於循環是否與計算密切相關。這就是爲什麼其他語言爲此提供特殊語言功能(循環標籤,中斷等整數參數)。 –

0

你應該將你的循環包裝在一個函數中,然後使用return從該函數返回。

+4

這是一個經典的強迫因爲語言方面的設計。這應該是相反的 – SomeWittyUsername

+1

我同意在某些情況下,這可能是做這件事的方式。不知道OP的實際問題很難給出明確的答案。我認爲對於幾乎所有的用例來說,將迭代包裝到實現算法的函數中會產生比使用goto更清晰的解決方案。 –

+0

一個很好的啓發是問你是否能爲該功能提出一個好名字。同樣的問題是這個循環是否做了一些獨特的,可識別的事情。如果存在這樣的名字,那麼它會讓你的代碼自我評論。如果沒有這樣的名字存在,那麼文本內容將更容易閱讀,因爲它使讀者不必穿透額外的間接層。 –

0

在使用goto語句進行編程時,程序的邏輯錯綜複雜。在現代編程中,goto語句被認爲是一種有害的構造和糟糕的編程習慣。

你可以使用它作爲一個功能,當條件發生函數退出

int loop(int it,int it2) 
{ 
    for (int it=0; it<5; it++) { 
    for (int it2=0; it2<5; it2++) { 
     if (it2==2) return 0; //function returns here 
     NSLog(@"it=%d it2=%d", it, it2); 
    } 
    } 
    return 1; 
} 
+3

突破循環是一種情況,其中'goto'被認爲是非常好的。而且不會有太多的複雜性,因爲標籤真的很接近跳躍。 –

+0

我同意goto是有用的,但從專業程序員的角度來看,它被認爲是使用goto語句的壞習慣。因爲這可能會在複雜程序中使用時讀取其他人的代碼時產生歧義。簡單的就可以了。但就他的知識而言,我讓他知道使用goto是一種壞習慣。 – Sorcrer

+1

除了這種情況外,它被視爲一種壞習慣。地獄,甚至MISRA C++允許這樣做。我沒有看到如何在一個函數中包裝循環更好,它只是降低了我的看法的可讀性,並沒有提供任何優勢,因爲返回也打破了控制流。 – Veritas

4

可以使用bool flag以服務爲宗旨,是這樣的:

bool flag = false; 
for (int it=0; it<5; it++) { 
    for (int it2=0; it2<5; it2++) { 
     if (it2==2) { flag=true; break; } 
     NSLog(@"it=%d it2=%d", it, it2); 
    } 
    if(flag) {break;} 
} 

應使用這個方法只有在您不能使用他人指定的return方法的情況下。 return改善了代碼可讀性。這只是一個解決方法。

goto方法也是有效的,但它始終是建議不要使用goto,只是因爲它打破了控制流,並可能導致調試的時間,如果代碼是夠大!

+1

在我眼裏,這比使用'goto'更不可讀和清晰。 –

+0

我有同樣的想法,但如果陳述是不必要的。你可以添加條件在語句 – Szu

+0

@Szu我同意你的建議! – CinCout

-1

不幸的是,C++沒有那種突破。被認爲是可憎的可能性是使用goto。 有兩種可接受的解決方案:

  1. 將這個代碼在一個單獨的函數,並使用返回

  2. 使用一個布爾標誌

    布爾stopFlag = FALSE; for(int it = 0; it &!stopFlag;它++){ 爲 (INT IT2 = 0; IT2 < 5; IT2 ++){ 如果 (無論) { stopFlag = TRUE; 休息; }}

+0

這是少數幾個使用goto被認爲是更好的解決方案的案例之一。 – Veritas

+0

Veritas,我認爲,否則,因爲在這種情況下有兩個乾淨的替代品。但這是一個品味問題。 –

+0

當然有其他選擇,但轉到是更清潔的選擇。返回實際上是一個變相的轉換,它也打破了控制流程,因此除了爲程序員提供額外的工作之外,它不提供任何優勢。 – Veritas

1

在C/C++,你真的沒有這樣的事情。已經有一些明確的答案,例如使用goto什麼的。就個人而言,我不喜歡goto s和它們導致一些草率代碼(IMO)的東西。

對我來說,你有兩個很好的選擇。

  1. 編寫循環條件,使它們包含兩者中的退出條件。這是我個人的方式,因爲我不喜歡在循環中使用break或其他東西的想法,除非我絕對必須這樣做。我只是覺得它讓一點點清潔產品成爲一切,而這正是我所教的。

  2. 如果您確實決定保持中斷,那麼不要使用單行if()來控制它,而是將其分解爲兩部分並創建一個「中斷標誌」,如果滿足中斷條件,將會設置該中斷標誌。從那裏,如果設置了該標誌,則在外循環中放置一個附加條件以退出,或者在外循環(但不在內循環內部)中設置另一個條件(如果設置了該標誌則會中斷)。

希望這會有所幫助。