0

C++ の本にこのコードがありますが、このコードの意味がわかりません。

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

これはすべて 1 行で書かれています。このコードを書く別の方法はありますか? なぜ「;」があるのか​​もわかりません for ループの最初の変数の前に....

4

6 に答える 6

5

clause 1forループではオプションです。が等しくないか、または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 句-1 が宣言である場合、それが宣言する識別子の範囲は、宣言の残りの部分と、他の 2 つの式を含むループ全体です。

1778 制御式の最初の評価の前に、実行の順序で到達します。

1779 節-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);
 }

IsNotFoundtrue の場合にのみループします。

于 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 the 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++
于 2013-04-29T19:02:28.377 に答える