2013-04-29 99 views
1

我有我的C++的书这段代码,而且我不确定这是什么代码的意思是:了解速记C++

for (; counter < fooCnt && 
     (toLower(array[counter].getFooTitle()).find(x) == string::npos) 
     ; counter++); 

这一切都是在同一行,有没有这个代码可以写成另一种方式?我也不明白为什么会有一个“;”在for循环的开始处的变量之​​前...

+2

这意味着作者正在搞砸你。 ;-) – 2013-04-29 19:02:01

+0

我相信你很熟悉'for(int i = 0; i <10; i ++)'的格式。正如你所看到的那里有2';'那里。在你的例子中,你只需跳过可变部分。 – 2013-04-29 19:03:37

回答

5

clause 1在for循环中是可选的。它说要循环直到array[counter].getFooTitle()).find(x)不等于string::nposcounter >= 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的表达>表达-2是控制表达式 被评估每次执行循环体之前。

1776在每次执行循环体之后,表达式-3被评估为空表达式 。

1777如果子句-1是一个声明,它声明的任何 标识符的范围是声明的剩余部分和整个循环,包括其他两个表达式;

1778在控制表达式的第一个 评估之前,按执行顺序达到它。

1779如果条款-1是一个表达式,它被评价为控制 expression.134的第一评估之前的空隙 表达)

1780两者子句-1和表达-3可以省略。

1781省略的表达式-2被非零常量替换。

顺便说一句,for循环也可以被认为是一个while循环。

+1

德摩根定理失败。实际上,它循环直到找到某个东西**或**'counter> = fooCnt'。 – 2013-04-29 19:11:47

+0

@ BenVoigt:啊,ooops – 2013-04-29 19:13:13

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是真实的。

+0

更好地调用'IsNotFound'。此外,我认为你有一个接一个的。 – 2013-04-29 19:08:52

1

我会尽力解释这一行。首先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++ 
2

这是相同

for (counter = counter; counter < fooCnt; counter++) { 
    if (toLower(array[counter].getFooTitle()).find(x) != string::npos) break; 
} 

例如counter从当前值增加1,直到fooCnt。但是,如果找到任何标题,它会提前停止。

+0

是不是counter = counter冗余..为什么不使用'int i = counter'来代替? – 2013-04-29 20:37:31

+1

@ 0A0D:它是多余的,但它把它放入可识别的形式中for(var = start; var 2013-04-29 21:11:42

1

是的,这很丑陋。我会分解一点。

int i = 0; 
for(; i < fooCnt; ++i) { 
    auto lowcase = toLower(array[i].getFooTitle()); 
    if(lowcase.find(x) != string::npos) { 
     break; 
    } 
} 
+0

不应该以'int i = counter;'开头吗? – 2013-04-29 19:09:55

+0

@BenVoigt:超过可能的计数器是0,所以这将工作..我可以看到你的观点。 – 2013-04-29 20:37:00

+0

@ BenVoigt:是的,我在进入循环之前假设'counter'为0。我可能是错的。 – 2013-04-29 20:55:38

1

是否有这个代码可以写成另一种方式?

这可能是更清晰的

while (counter < fooCnt && 
     (toLower(array[counter].getFooTitle()).find(x)==string::npos)) 
{ 
    ++counter; 
} 

即虽然我们还没有达到极限,我们还没有找到x,移动到下一个。等同地,循环直到我们达到极限我们发现x

我也不明白为什么会出现“;” for循环的开始一个变量之前

for语句有三个子句,如

for (int i = 0; i < n; ++i) 

首先声明和/或初始化变量在循环使用 - 它可以是如果像这样,你不想要任何东西,那就是空的。第二个是在每次迭代之前评估以决定是否继续 - 如果您始终想要继续,则可以为空。第三次在每次迭代之后进行评估 - 如果迭代之间没有任何更新,则可以为空。

+0

++计数器和计数器++有什么区别?我假设你增加,直到柜台? – user12074577 2013-04-29 19:20:06

+1

@ user12074577:如果在这里,你没有使用表达式的结果,那么没有什么区别。我习惯于使用'++ counter',因为在某些情况下(但不在这里),它可能比'counter ++'更有效率。 – 2013-04-29 19:22:20