C++ の本にこのコードがありますが、このコードの意味がわかりません。
for ( ; counter < fooCnt &&
(toLower(array[counter].getFooTitle()).find(x) == string::npos)
; counter++);
これはすべて 1 行で書かれています。このコードを書く別の方法はありますか? なぜ「;」があるのかもわかりません for ループの最初の変数の前に....
clause 1
forループではオプションです。が等しくないか、またはarray[counter].getFooTitle()).find(x)
等しくないまでループすると言われていますstring::npos
counter >= 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 ループのように考えることもできます。
このように書くことができます
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
true の場合にのみループします。
と同じです
for ( counter = counter; counter < fooCnt; counter++ ) {
if (toLower(array[counter].getFooTitle()).find(x) != string::npos) break;
}
たとえばcounter
、現在の値から 1 ずつ増加し、 まで進みfooCnt
ます。ただし、いずれかのタイトルが見つかった場合は、早期に停止します。
ええ、それはかなり醜いです。私はそれを少し分解します。
int i = 0;
for(; i < fooCnt; ++i) {
auto lowcase = toLower(array[i].getFooTitle());
if(lowcase.find(x) != string::npos) {
break;
}
}
この行を説明しようと思います。最初の 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++