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

Can a for loop have an assignment in its statement?

本文关键字:赋值 语句 循环 for      更新时间:2023-10-16

我遇到了这种语法

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);
}

事实是,每次满足条件时,增量语句都会在循环主体的末尾执行。所以,你可以把它看作是身体的最后指令。

有时,您可以将增量语句

留空;在这种情况下,您将正文的唯一指令放在增量语句的位置。

从标准:

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

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

上述语法生成的代码等效于:

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

所以它不一定是增量的。

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

在许多情况下,操作确实是递增一个变量,并且条件可能会检查该变量是否不超过某个限制。不要让这混淆您,请记住for循环具有以下(常规(结构:

for (init; condition; operation)

不必是增量表达式。它应该做什么由你决定。代码在语义上与以下内容相同。

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 循环将具有与下面的 while 循环相同的结果:

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

有人可能会争辩说,你给出的 for 循环示例是否是一种理想的编码风格。

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

其实不然。您误解了(或被错误地教导了(for循环结构。

以下是其组件:

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

就是这样。

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

这个循环将在getline返回一个没有错误的流时运行(看看operator bool(。在每次迭代中,st将被推送到v。我会根据循环重写while

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

重要的是条件块中代码的最终状态有一个值。将该值与零进行比较,如果为零,则不输入 for 循环。从本质上讲,在电信公司使用C和Unix的古老小程序时代,通过在执行条件块中的代码后检查'Z'ero标志来评估累加器的内容是否为零状态。

v.push_back(st( 是一个对 'st' 参数执行操作的函数。 但是,根据您的问题,不会显示该操作。所以我们无法确定它是否是增量。但是,语法是很有可能的!!