了解c++简写

Understanding shorthand C++

本文关键字:简写 c++ 了解      更新时间:2023-10-16

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

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

这都在一行上,有没有其他方法可以写这段代码?我也不明白为什么在for循环开始的变量之前有一个";"....

for循环中的

clause 1是可选的。它说循环直到array[counter].getFooTitle()).find(x)不等于string::nposcounter >= fooCnt

&&为短路与运算符。如果你忘记了这部分,请回到真值表。

counter < fooCnt && (toLower(array[counter].getFooTitle()).find(x)==string::npos)为expression-2, counter++为expression-3

counter随之递增。

C标准6.8.5.3中的

:

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替换为非零常数。

顺便说一下,for循环也可以看作是while循环。

你可以这样写

 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;
    }
}