0

我的 C++ 书中有这段代码,但我不确定这段代码的含义:

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

这一切都在一条线上,有没有另一种方式可以编写这段代码?我也不明白为什么有一个“;” 在 for 循环开始的变量之前....

4

6 回答 6

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 表达式 >expression-2 是在每次执行循环体之前计算的控制表达式。

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

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

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

1779 如果clause-1是一个表达式,它在控制表达式的第一次计算之前被计算为一个空表达式。134)

1780 子句 1 和表达式 3 都可以省略。

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

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

于 2013-04-29T19:01:38.117 回答
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为真时才会循环。

于 2013-04-29T19:02:11.823 回答
2

这是一样的

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

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

于 2013-04-29T19:07:47.763 回答
1

是的,这很丑陋。我会把它分解一下。

int i = 0;
for(; i < fooCnt; ++i) {
    auto lowcase = toLower(array[i].getFooTitle());
    if(lowcase.find(x) != string::npos) {
        break;
    }
}
于 2013-04-29T19:08:10.833 回答
1

我将尝试解释这一行。起初 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++
于 2013-04-29T19:02:28.377 回答
1

有没有另一种方法可以编写这段代码?

它可能更清楚

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

即,虽然我们还没有达到极限,我们还没有找到x,继续下一个。等效地,循环直到达到极限找到x.

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

for语句包含三个子句,如

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

第一个声明和/或初始化要在循环中使用的变量 - 如果像这里一样,您不需要任何变量,它可以为空。第二个在每次迭代之前评估以决定是否继续 - 如果您总是想继续,它可以为空。第三个在每次迭代后进行评估 - 如果迭代之间没有任何要更新的内容,它可以为空。

于 2013-04-29T19:13:53.097 回答