for 循环可以在其语句中具有赋值吗?
Can a for loop have an assignment in its statement?
我遇到了这种语法
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' 参数执行操作的函数。 但是,根据您的问题,不会显示该操作。所以我们无法确定它是否是增量。但是,语法是很有可能的!!
- 变量在使用赋值语句赋值后恢复为以前的值
- 对于单个数据 WORD 的 memcpy 和赋值语句有什么区别?
- 如何使C++编译器遵循与C#在该赋值语句中相同的优先级、关联性和求值顺序
- 复制构造函数和复制赋值运算符是否应具有相同的语句?
- c++ 如何计算赋值运算符(if 语句)
- 静态成员函数赋值而不带返回语句
- 在 If 语句 [C++] 中赋值变量
- 我很难为 if/else 语句编写此赋值的代码.这是第一堂编程课
- 为什么常量字符 INITIAL='G' 不是赋值语句?
- 基本赋值语句
- 在一个语句中对原子布尔变量进行多次赋值
- 什么是成员数据指针的正确赋值语句
- 赋值运算符和条件语句
- 需要左值作为赋值错误的左操作数通过 if 语句
- 如果赋值/语句在C++中意味着什么
- 循环内部的赋值语句
- 为什么这个c++赋值语句是非法的
- 赋值语句截断字符
- C++指针赋值语句似乎不起作用/做任何事情
- 在C语言中,如果if语句包含赋值语句,是否会更快?