理解速记C ++

时间:2013-04-29 18:59:45

标签: c++ shorthand

我的C ++书中有这段代码,我不确定这段代码是什么意思:

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

这一切都在一行上,是否有另外一种方法可以编写代码?我不明白为什么还有“;”在for循环开头的变量之前......

6 个答案:

答案 0 :(得分:5)

for循环中的

clause 1是可选的。它会循环,直到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表达式&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)

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