我來到這句法for循環可以在其聲明中分配嗎?
for (string st; getline(is, st, ' '); v.push_back(st));
^ ^ ^
initialization condition, increment ???
怎樣的v.push_back(st)
工作作爲增量當這樣被覆蓋getline(is, st, ' ')
?
我來到這句法for循環可以在其聲明中分配嗎?
for (string st; getline(is, st, ' '); v.push_back(st));
^ ^ ^
initialization condition, increment ???
怎樣的v.push_back(st)
工作作爲增量當這樣被覆蓋getline(is, st, ' ')
?
這相當於:
for (string st; getline(is, st, ' ');)
v.push_back(st);
或:
{
string st;
while (getline(is, st, ' '))
v.push_back(st);
}
的事實是,增量聲明是在條件滿足的循環的每一次身體的末端執行。所以,你可以把它看作是身體最後的指示。
有時,您可能會將增量語句留空;在這種情況下,你把主體的唯一指令代替增量語句。
謝謝,我不知道增量語句可能只是增量語句。 –
「,在這種情況下,您只需將主體的指令替換爲增量語句。」 - 你*可以*做到這一點,但從編碼風格的角度來看,這可能不是一個好主意。如果你需要添加第二條語句怎麼辦?恕我直言,增量應該在語義上是「爲下一次迭代做好準備/完成本次迭代」 - 事物的種類,這可能是也可能不是。 – Kevin
@Kevin你正在踢開一扇敞開的大門!我絕對同意。 –
此循環將運行,而getline
返回一個沒有錯誤的流(看看operator bool
)。每次迭代時,st
將被推入v
。我想改寫這個在while
循環方面:
string st;
while(getline(is, st, ' '))
{
v.push_back(st)
}
從standard:
for (init-statement condition(optional) ; iteration_expression(optional)) statement
iteration_expression - 任何表達,這是每一個 迭代之前重新循環和後執行評估條件。通常, 這是遞增
上述語法產生代碼等同於循環計數器的表達:
{
init_statement;
while (condition) {
statement;
iteration_expression;
}
}
所以不必被遞增。
不應該是'init-statement'可選的? – user
分號錯誤被添加到編輯中,我會更新它。通過正式定義,它不是可選的,但它可能是空的,必須以';'結尾。 –
好吧,如果你在'statement'的某個地方使用'continue',那麼你的重寫是不完全正確的。 – Deduplicator
它確實不是必須是增量表達式。預計要做的是由你決定的。代碼與以下語義相同。
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
}
它不增加任何東西。當條件部分不滿足時,for循環終止。所以當getline
返回false時,循環將終止。
在很多情況下,操作確實增加了一個變量,並且該條件可能檢查該變量是否超過某個限制。不要讓這種迷惑你,只記得for
循環具有以下(通用)結構:
for (init; condition; operation)
謝謝,始終認爲'操作'將會是一個增量表述。 –
答案是不作爲增量工作。
for循環將會有同樣的結果如下while循環:如果循環例如你給的是一個理想的編碼風格
string st;
while (getline(is, st, ' '))
{
v.push_back(st);
}
有人可能會爭辯。
v.push_back(st)
如何在getline(is, st, ' ')
覆蓋v.push_back(st)
?
它沒有。你誤解了(或被誤認爲)for
循環結構。
下面是其組成部分:
false
;就是這樣。
沒有什麼可以指示這些組件中的哪一個(如果有的話)執行增量。考慮一個常見的例子for (;;)
…根本沒有任何操作,更不用說增量了!
重要的是條件塊中代碼的最終狀態有一個值。該值與零進行比較,如果爲零,則不會輸入for循環。本質上,在電信公司使用C和Unix的良好的舊的小程序日期中,通過在條件塊中的代碼執行後檢查'Z'ero標誌來評估累加器的內容爲零狀態。
v.push_back(st)是對「st」參數執行操作的函數。然而,根據你的問題操作並未顯示。所以我們無法確定它是否是增量。但是,語法很有可能!
它不一定是'增量',只是一個操作,任何操作。只要滿足條件,就會不斷向字符串中插入字符串。 – Unimportant
總之,**是**它可以。 – CinCout
'v.push_back'是一個函數調用,不是任務 –