2015-11-03 71 views
21

我來到這句法for循環可以在其聲明中分配嗎?

for (string st; getline(is, st, ' '); v.push_back(st)); 
     ^    ^    ^
    initialization condition, increment ??? 

怎樣的v.push_back(st)工作作爲增量當這樣被覆蓋getline(is, st, ' ')

+11

它不一定是'增量',只是一個操作,任何操作。只要滿足條件,就會不斷向字符串中插入字符串。 – Unimportant

+0

總之,**是**它可以。 – CinCout

+1

'v.push_back'是一個函數調用,不是任務 –

回答

34

這相當於:

for (string st; getline(is, st, ' ');) 
    v.push_back(st); 

或:

{ 
    string st; 
    while (getline(is, st, ' ')) 
     v.push_back(st); 
} 

的事實是,增量聲明是在條件滿足的循環的每一次身體的末端執行。所以,你可以把它看作是身體最後的指示。

有時,您可能會將增量語句留空;在這種情況下,你把主體的唯一指令代替增量語句。

+0

謝謝,我不知道增量語句可能只是增量語句。 –

+5

「,在這種情況下,您只需將主體的指令替換爲增量語句。」 - 你*可以*做到這一點,但從編碼風格的角度來看,這可能不是一個好主意。如果你需要添加第二條語句怎麼辦?恕我直言,增量應該在語義上是「爲下一次迭代做好準備/完成本次迭代」 - 事物的種類,這可能是也可能不是。 – Kevin

+3

@Kevin你正在踢開一扇敞開的大門!我絕對同意。 –

4

此循環將運行,而getline返回一個沒有錯誤的流(看看operator bool)。每次迭代時,st將被推入v。我想改寫這個在while循環方面:

string st; 
while(getline(is, st, ' ')) 
{ 
    v.push_back(st) 
} 
28

standard

for (init-statement condition(optional) ; iteration_expression(optional)) statement 

iteration_expression - 任何表達,這是每一個 迭代之前重新循環和後執行評估條件。通常, 這是遞增

上述語法產生代碼等同於循環計數器的表達:

{ 
    init_statement; 
    while (condition) { 
     statement; 
     iteration_expression; 
    } 
} 

所以不必被遞增。

+0

不應該是'init-statement'可選的? – user

+1

分號錯誤被添加到編輯中,我會更新它。通過正式定義,它不是可選的,但它可能是空的,必須以';'結尾。 –

+4

好吧,如果你在'statement'的某個地方使用'continue',那麼你的重寫是不完全正確的。 – Deduplicator

8

它確實不是必須是增量表達式。預計要做的是由你決定的。代碼與以下語義相同。

string st;      // run before the loop and only once 
while (getline(is, st, ' ')) { // condition used to determine the loop should continue or break 
    v.push_back(st);    // run every time inside the loop 
} 
9

它不增加任何東西。當條件部分不滿足時,for循環終止。所以當getline返回false時,循環將終止。

在很多情況下,操作確實增加了一個變量,並且該條件可能檢查該變量是否超過某個限制。不要讓這種迷惑你,只記得for循環具有以下(通用)結構:

for (init; condition; operation) 
+1

謝謝,始終認爲'操作'將會是一個增量表述。 –

6

答案是不作爲增量工作。

for循環將會有同樣的結果如下while循環:如果循環例如你給的是一個理想的編碼風格

string st; 
while (getline(is, st, ' ')) 
{ 
    v.push_back(st); 
} 

有人可能會爭辯。

5

v.push_back(st)如何在getline(is, st, ' ')覆蓋v.push_back(st)

它沒有。你誤解了(或被誤認爲)for循環結構。

下面是其組成部分:

  • 一個語句循環開始前進行評估;
  • 在每次迭代開始時要評估的表達式,如果表達式轉換爲布爾型false;
  • 在每次迭代結束時要評估的非聲明性語句。

就是這樣。

沒有什麼可以指示這些組件中的哪一個(如果有的話)執行增量。考慮一個常見的例子for (;;)…根本沒有任何操作,更不用說增量了!

1

重要的是條件塊中代碼的最終狀態有一個值。該值與零進行比較,如果爲零,則不會輸入for循環。本質上,在電信公司使用C和Unix的良好的舊的小程序日期中,通過在條件塊中的代碼執行後檢查'Z'ero標誌來評估累加器的內容爲零狀態。

1

v.push_back(st)是對「st」參數執行操作的函數。然而,根據你的問題操作並未顯示。所以我們無法確定它是否是增量。但是,語法很有可能!