for循环可以在其语句中赋值吗?

Str*_*vaz 21 c++ for-loop c++11

我发现了这种语法

for (string st; getline(is, st, ' '); v.push_back(st)); 
        ^                  ^                  ^
    initialization   condition, increment    ???
Run Code Online (Sandbox Code Playgroud)

v.push_back(st)当工作被覆盖时,工作如何作为增量getline(is, st, ' ')

Pao*_*o M 34

这相当于:

for (string st; getline(is, st, ' '); )
    v.push_back(st);
Run Code Online (Sandbox Code Playgroud)

要么:

{
    string st;
    while (getline(is, st, ' '))
        v.push_back(st);
}
Run Code Online (Sandbox Code Playgroud)

事实是,每当条件满足时,递增语句就在循环体的末尾执行.所以,你可以把它看作身体的最后一条指令.

有时,您可以将增量语句留空; 在这种情况下,您将身体的唯一指令放在增量语句的位置.

  • "在这种情况下,你把身体的唯一指令放在增量声明的位置." - 你*可以*这样做,但从编码风格的角度来看,这可能不是一个好主意.如果您需要添加第二个语句怎么办?恕我直言,增量应该在语义上是"为下一次迭代做好准备/完成这次迭代"的事情,这可能是也可能不是这里的情况. (5认同)
  • @Kevin你正在打开一扇门!我绝对同意. (3认同)

Rom*_*kov 28

标准:

 for ( init-statement condition(optional) ; iteration_expression(optional) ) statement
Run Code Online (Sandbox Code Playgroud)

iteration_expression - 任何表达式,在循环的每次迭代之后和重新评估条件之前执行.通常,这是增加循环计数器的表达式

上面的语法产生的代码相当于:

{
    init_statement; 
    while ( condition ) { 
        statement;
        iteration_expression; 
    }
}
Run Code Online (Sandbox Code Playgroud)

所以它不必增加.

  • 好吧,如果你在`statement`中的某个地方使用`continue`,你的重写就不太正确了.</迂腐> (4认同)

Mar*_*oun 9

它不会增加任何东西.当条件部分不满足时,for循环终止.因此,当getline返回false时,循环将终止.

在许多情况下,操作确实会增加一个变量,并且条件可能会检查该变量是否超过某个限制.不要让这让你感到困惑,只要记住for循环有以下(一般)结构:

for (init; condition; operation)
Run Code Online (Sandbox Code Playgroud)


son*_*yao 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
}
Run Code Online (Sandbox Code Playgroud)


Rem*_*art 6

答案是它不能作为增量.

for循环将与下面的while循环具有相同的结果:

string st;
while (getline(is, st, ' '))
{
    v.push_back(st);
}
Run Code Online (Sandbox Code Playgroud)

如果你给出的for循环示例是一种理想的编码风格,人们可能会争论.


Lig*_*ica 5

v.push_back(st)当工作被覆盖时,工作如何作为增量getline(is, st, ' ')

它没有.你误解了(或被误导了)for循环结构.

以下是其组成部分:

  • 循环开始前要评估的语句;
  • 要在每次迭代开始时计算的表达式,如果表达式转换为boolean,则将取消该表达式false;
  • 每次迭代结束时要评估的非声明性语句.

而已.

没有什么可以决定这些组件的哪些(如果有的话)执行增量.考虑一下常见的例子for (;;)......根本没有任何操作,更不用说增量了!