我有我的C++的书这段代码,而且我不确定这是什么代码的意思是:了解速记C++
for (; counter < fooCnt &&
(toLower(array[counter].getFooTitle()).find(x) == string::npos)
; counter++);
这一切都是在同一行,有没有这个代码可以写成另一种方式?我也不明白为什么会有一个“;”在for循环的开始处的变量之前...
我有我的C++的书这段代码,而且我不确定这是什么代码的意思是:了解速记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
正是如此递增。
:
1774声明
for (clause-1 ; expression-2 ; expression-3) statement
行为如下:
1775的表达>表达-2是控制表达式 被评估每次执行循环体之前。
1776在每次执行循环体之后,表达式-3被评估为空表达式 。
1777如果子句-1是一个声明,它声明的任何 标识符的范围是声明的剩余部分和整个循环,包括其他两个表达式;
1778在控制表达式的第一个 评估之前,按执行顺序达到它。
1779如果条款-1是一个表达式,它被评价为控制 expression.134的第一评估之前的空隙 表达)
1780两者子句-1和表达-3可以省略。
1781省略的表达式-2被非零常量替换。
顺便说一句,for循环也可以被认为是一个while循环。
德摩根定理失败。实际上,它循环直到找到某个东西**或**'counter> = fooCnt'。 – 2013-04-29 19:11:47
@ BenVoigt:啊,ooops – 2013-04-29 19:13:13
你可以写这样的
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
是真实的。
更好地调用'IsNotFound'。此外,我认为你有一个接一个的。 – 2013-04-29 19:08:52
我会尽力解释这一行。首先for循环看起来像这样的(init部分;条件部分;下一步的一部分)。所以第一个;意味着init部分被跳过。通常在为statment之后是被执行的代码,但在这种情况下,它被冒号跳过。
在条件检查是这样的代码:
counter<fooCnt && (toLower(array[counter].getFooTitle()).find(x)==string::npos)
如果条件counter<fooCnt
是真如下因素代码会被执行:计数器increaded
toLower(array[counter].getFooTitle()).find(x)==string::npos
每一个循环后至少。
counter++
这是相同
for (counter = counter; counter < fooCnt; counter++) {
if (toLower(array[counter].getFooTitle()).find(x) != string::npos) break;
}
例如counter
从当前值增加1,直到fooCnt
。但是,如果找到任何标题,它会提前停止。
是不是counter = counter冗余..为什么不使用'int i = counter'来代替? – 2013-04-29 20:37:31
@ 0A0D:它是多余的,但它把它放入可识别的形式中for(var = start; var
是的,这很丑陋。我会分解一点。
int i = 0;
for(; i < fooCnt; ++i) {
auto lowcase = toLower(array[i].getFooTitle());
if(lowcase.find(x) != string::npos) {
break;
}
}
不应该以'int i = counter;'开头吗? – 2013-04-29 19:09:55
@BenVoigt:超过可能的计数器是0,所以这将工作..我可以看到你的观点。 – 2013-04-29 20:37:00
@ BenVoigt:是的,我在进入循环之前假设'counter'为0。我可能是错的。 – 2013-04-29 20:55:38
是否有这个代码可以写成另一种方式?
这可能是更清晰的
while (counter < fooCnt &&
(toLower(array[counter].getFooTitle()).find(x)==string::npos))
{
++counter;
}
即虽然我们还没有达到极限,和我们还没有找到x
,移动到下一个。等同地,循环直到我们达到极限或我们发现x
。
我也不明白为什么会出现“;” for循环的开始一个变量之前
的for
语句有三个子句,如
for (int i = 0; i < n; ++i)
首先声明和/或初始化变量在循环使用 - 它可以是如果像这样,你不想要任何东西,那就是空的。第二个是在每次迭代之前评估以决定是否继续 - 如果您始终想要继续,则可以为空。第三次在每次迭代之后进行评估 - 如果迭代之间没有任何更新,则可以为空。
++计数器和计数器++有什么区别?我假设你增加,直到柜台? – user12074577 2013-04-29 19:20:06
@ user12074577:如果在这里,你没有使用表达式的结果,那么没有什么区别。我习惯于使用'++ counter',因为在某些情况下(但不在这里),它可能比'counter ++'更有效率。 – 2013-04-29 19:22:20
这意味着作者正在搞砸你。 ;-) – 2013-04-29 19:02:01
我相信你很熟悉'for(int i = 0; i <10; i ++)'的格式。正如你所看到的那里有2';'那里。在你的例子中,你只需跳过可变部分。 – 2013-04-29 19:03:37