我的C ++书中有这段代码,我不确定这段代码是什么意思:
for ( ; counter < fooCnt &&
(toLower(array[counter].getFooTitle()).find(x) == string::npos)
; counter++);
这一切都在一行上,是否有另外一种方法可以编写代码?我不明白为什么还有“;”在for循环开头的变量之前......
答案 0 :(得分:5)
clause 1
是可选的。它会循环,直到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表达式&gt;表达式-2是控制表达式 在每次执行循环体之前进行评估。
1776将表达式-3表达为空表达式 每次执行循环体后。
1777如果第1条是声明,则是任何范围 它声明的标识符是声明的剩余部分和 整个循环,包括其他两个表达式;
1778年,它按照第一个执行顺序到达 评价控制表达。1779如果子句-1是表达式,则将其评估为void 在第一次评估控制之前的表达 expression.134)
1780可以省略第1条和第3条表达式。
1781省略的表达式-2被非零常量替换。
顺便说一句,for循环也可以被认为是一个while循环。
答案 1 :(得分:3)
你可以像这样写
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
为真时才会循环。
答案 2 :(得分:2)
与
相同for ( counter = counter; counter < fooCnt; counter++ ) {
if (toLower(array[counter].getFooTitle()).find(x) != string::npos) break;
}
e.g。 counter
从当前值开始增加1,直至fooCnt
。但如果发现任何标题,它会提前停止。
答案 3 :(得分:1)
我会尝试解释这一行。首先,for循环看起来像 for(init part; condition part; part for next step)。所以第一个;表示已跳过init部分。通常在for语句之后是执行的代码,但在这种情况下,它被冒号跳过。
条件检查中的是这段代码:
counter<fooCnt && (toLower(array[counter].getFooTitle()).find(x)==string::npos)
如果条件counter<fooCnt
为真,则将执行以下代码:
toLower(array[counter].getFooTitle()).find(x)==string::npos
至少在每次循环后计数器都会递增。
counter++
答案 4 :(得分:1)
是的,这很难看。我会把它分解一下。
int i = 0;
for(; i < fooCnt; ++i) {
auto lowcase = toLower(array[i].getFooTitle());
if(lowcase.find(x) != string::npos) {
break;
}
}
答案 5 :(得分:1)
是否可以编写此代码的其他方式?
可能更清楚
while (counter < fooCnt &&
(toLower(array[counter].getFooTitle()).find(x)==string::npos))
{
++counter;
}
即。虽然我们还没有达到限制,和我们还没有找到x
,转到下一个。等效地,循环直到达到限制或我们找到x
。
我不明白为什么会有“;”在for循环开头的变量之前
for
语句有三个子句,如
for (int i = 0; i < n; ++i)
第一个声明和/或初始化要在循环中使用的变量 - 如果在这里你不需要任何变量,它可以是空的。在每次迭代之前评估第二个以决定是否继续 - 如果您总是想继续,它可以为空。第三次在每次迭代后进行评估 - 如果在迭代之间没有任何更新,它可以为空。