2016-11-05 106 views
1

假設您想要在C++中創建一個for循環,但除了確定的條件之外,您還知道什麼時候該循環或應該停止循環。請注意,這樣的條件不一定必須是硬編碼的,循環也不應該始終具有這樣的確定值。這只是一個例子,可能對隨機循環有用,或者在運行時確定內容的內容。讓我們保持這個例子的簡單,並將重點放在可以應用於編程中的任何此類相關任務的解決方案上。C++什麼是停止for循環的「最佳」方式?

我想比較這兩個解決方案。第一個使用break語句,第二個使用多個或組合條件。就效率或可靠性而言,哪一種是完成任務的「最佳」或「正確」方式。哪一個不太容易出錯?隨意提出另一種解決方案。

const int MAX_SIZE = 10; 
int myArray[MAX_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

// two ways to stop a loop 

for (int x = 0; x < MAX_SIZE; x++) { 
    if (myArray[x] == 7) { 
     break; 
    } 
    cout << myArray[x] << 「 「; // fixed 
} 

for (int x = 0; (x < MAX_SIZE) && (myArray[x] != 7); x++) { 
    cout << myArray[x] << 「 「; 
} 
+1

我會選擇第二種形式,因爲它將條件保留在一個地方,並且實際的循環代碼不受干擾。我認爲這歸結於優先。 – user2296177

+2

似乎你的循環有不同的行爲。假設x爲0,myArray [0]等於7. – PaulMcKenzie

+0

我的意思是說,在這兩種情況下,您每次都進行相同次數的比較。我認爲第一個更具可讀性,不過因爲任何人都可以將標準的'for'循環代碼遮住,並將第二個條件看作是特殊的東西。老實說,我認爲這只是微不足道的。 –

回答

3

首先,循環的行爲看起來不同 - 第一個仍然打印號碼7而其他沒有。

如果你交換了行,這對編譯器來說不會有什麼不同,這兩種解決方案都會被編譯成幾乎相同的本地代碼。

關於可讀性(以及容易出錯):這取決於,對於這樣一個簡單的規則來說,它可能更好,更具可讀性,使其成爲條件的一部分。但是當它變得更加複雜時,可能需要引入一些臨時變量,然後break變體更易於閱讀。實際上,在循環內部使用break更復雜的算法是很常見的,通常在內部使用break甚至是無限循環。

1

這兩個循環並不等同。爲了使第一循環產生輸出作爲第二個相同的(至少,對於您所指定的數組的內容),你需要將其更改爲

for (int x = 0; x < MAX_SIZE; x++) 
{ 
    if (myArray[x] == 7) 
    { 
     break; 
    } 
    cout << myArray[x] << " "; 
} 

在實踐中,大多數人會發現你的第二個形式更具可讀性,因爲結束循環有一個明顯的條件,而不是兩個可以終止循環的獨立位置。這是我通常會使用的。

事實上,你認爲你的表單是相同的,這表明可讀性問題正在影響你。所以第二種形式肯定會更好。

+0

謝謝。循環的形式就是我的意思。 – Galaxy

2

正如其他人也指出的那樣,這兩種方法並不等同,因爲它們產生的輸出比另一種更多。但是,我猜這只是一個錯字,你可以通過運行代碼來確定。

出於比較的目的,如果您需要使用更多的停止條件(它的可讀性比持續時間更長)或者在停止循環之前執行其他操作,則第一個更容易推廣。例如,您可能首先檢查是否myArray[x] == 7,然後在斷開循環之前輸出一些內容,也許是這樣做的原因。因此,當代碼複雜時,第一種方法更好。

性能方面,這些方法非常相似。