我的 C++ 书中有这段代码,但我不确定这段代码的含义:
for ( ; counter < fooCnt &&
(toLower(array[counter].getFooTitle()).find(x) == string::npos)
; counter++);
这一切都在一条线上,有没有另一种方式可以编写这段代码?我也不明白为什么有一个“;” 在 for 循环开始的变量之前....
clause 1
在 for 循环中是可选的。它说循环直到array[counter].getFooTitle()).find(x)
不等于string::npos
或counter >= fooCnt
&&
是短路 AND 运算符。如果您忘记了这部分,请返回您的真值表。
counter < fooCnt && (toLower(array[counter].getFooTitle()).find(x)==string::npos)
是表达式 2 和counter++
是表达式 3
counter
因而递增。
在C 标准的6.8.5.3中:
第1774章 声明
for ( clause-1 ; expression-2 ; expression-3 ) statement
行为如下:
1775 表达式 >expression-2 是在每次执行循环体之前计算的控制表达式。
1776 每次执行循环体后,表达式 expression-3 被评估为 void 表达式。
1777 如果clause-1是一个声明,它声明的任何标识符的范围是声明的其余部分和整个循环,包括其他两个表达式;
1778 它在控制表达式的第一次评估之前的执行顺序到达。
1779 如果clause-1是一个表达式,它在控制表达式的第一次计算之前被计算为一个空表达式。134)
1780 子句 1 和表达式 3 都可以省略。
1781 省略的表达式 2 被非零常数替换。
顺便说一下,for 循环也可以被认为是 while 循环。
你可以这样写
int counter = 0;
bool IsNotFound = (toLower(array[counter].getFooTitle()).find(x)==string::npos);
for(;counter < fooCnt && IsNotFound;counter++)
{
// do stuff
//update IsNotFound for next iteration
IsNotFound =(toLower(array[counter].getFooTitle()).find(x) == string::npos);
}
只有当它IsNotFound
为真时才会循环。
这是一样的
for ( counter = counter; counter < fooCnt; counter++ ) {
if (toLower(array[counter].getFooTitle()).find(x) != string::npos) break;
}
例如counter
,从其当前值开始,增加 1,直到fooCnt
。但是,如果找到任何标题,它就会提前停止。
是的,这很丑陋。我会把它分解一下。
int i = 0;
for(; i < fooCnt; ++i) {
auto lowcase = toLower(array[i].getFooTitle());
if(lowcase.find(x) != string::npos) {
break;
}
}
我将尝试解释这一行。起初 for 循环看起来像这样for(init part; condition part; part for next step)。所以第一个;表示跳过了初始化部分。通常在 for 语句之后是被执行的代码,但在这种情况下,它被冒号跳过。
在条件检查中是这个代码:
counter<fooCnt && (toLower(array[counter].getFooTitle()).find(x)==string::npos)
如果条件counter<fooCnt
为真,将执行以下代码:
toLower(array[counter].getFooTitle()).find(x)==string::npos
至少在每个循环之后,计数器都会增加。
counter++
有没有另一种方法可以编写这段代码?
它可能更清楚
while (counter < fooCnt &&
(toLower(array[counter].getFooTitle()).find(x)==string::npos))
{
++counter;
}
即,虽然我们还没有达到极限,我们还没有找到x
,继续下一个。等效地,循环直到达到极限或找到x
.
我也不明白为什么有一个“;” 在 for 循环开始的变量之前
该for
语句包含三个子句,如
for (int i = 0; i < n; ++i)
第一个声明和/或初始化要在循环中使用的变量 - 如果像这里一样,您不需要任何变量,它可以为空。第二个在每次迭代之前评估以决定是否继续 - 如果您总是想继续,它可以为空。第三个在每次迭代后进行评估 - 如果迭代之间没有任何要更新的内容,它可以为空。