了解c++简写
Understanding shorthand C++
我在我的c++书中有这段代码,我不确定这段代码是什么意思:
for ( ; counter < fooCnt &&
(toLower(array[counter].getFooTitle()).find(x) == string::npos)
; counter++);
这都在一行上,有没有其他方法可以写这段代码?我也不明白为什么在for循环开始的变量之前有一个";"....
clause 1
是可选的。它说循环直到array[counter].getFooTitle()).find(x)
不等于string::npos
或counter >= fooCnt
&&
为短路与运算符。如果你忘记了这部分,请回到真值表。
counter < fooCnt && (toLower(array[counter].getFooTitle()).find(x)==string::npos)
为expression-2, counter++
为expression-3
counter
随之递增。
:
顺便说一下,for循环也可以看作是while循环。1774语句
for ( clause-1 ; expression-2 ; expression-3 ) statement
的行为如下:
1775表达式>expression-2是控制表达式在每次执行循环体之前求值。
1776表达式expression-3作为空表达式求值
1777如果子句1是一个声明,则any它声明的标识符是声明的剩余部分和整个循环,包括其他两个表达式;
1778按执行顺序在第一个之前到达控制表达式的求值。
1779如果子句-1是表达式,则将其计算为void表达式前的第一次评估控制expression.134)
1780 clause-1和expression-3都可以省略。
1781将省略的表达式-2替换为非零常数。
你可以这样写
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
。但是如果找到任何标题,它会提前停止。
我将试着解释这一行。首先,for循环看起来像这样for(init part;条件部分;(下一步部分)。第一个;意味着init部分被跳过。通常在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)
第一个声明和/或初始化循环中使用的变量——如果你不想要任何变量,它可以为空,就像这里一样。第二个在每次迭代之前求值,以决定是否继续——如果总是想继续,它可以为空。第三个变量在每次迭代之后求值——如果迭代之间没有需要更新的内容,它可以为空。
是的,这很丑。我会稍微分解一下。
int i = 0;
for(; i < fooCnt; ++i) {
auto lowcase = toLower(array[i].getFooTitle());
if(lowcase.find(x) != string::npos) {
break;
}
}