У меня есть этот код в моей книге C ++, и я не уверен, что этот код означает:
for ( ; counter < fooCnt &&
(toLower(array[counter].getFooTitle()).find(x) == string::npos)
; counter++);
Это все в одной строке. Есть ли другой способ написания этого кода? Я также не понимаю, почему есть «;» перед переменной в начале цикла for ….
clause 1
в цикле не является обязательным. Он говорит, что цикл до array[counter].getFooTitle()).find(x)
не равно string::npos
или же counter >= fooCnt
&&
является оператором короткого замыкания И Вернитесь к своим таблицам правды, если вы забыли эту часть.
counter < fooCnt && (toLower(array[counter].getFooTitle()).find(x)==string::npos)
это выражение-2 и counter++
это выражение-3
counter
увеличивается таким образом.
в 6.8.5.3 стандарта C:
1774 Заявление
for ( clause-1 ; expression-2 ; expression-3 ) statement
ведет себя следующим образом:
1775 Выражение> выражение-2 является управляющим выражением, которое
оценивается перед каждым выполнением тела цикла.1776 Выражение выражение-3 оценивается как пустое выражение
после каждого выполнения тела цикла.1777 Если пункт 1 является декларацией, сфера действия любого
идентификаторы, которые он объявляет, являются оставшейся частью объявления и
весь цикл, включая два других выражения;1778 достигнуто в порядке исполнения до первого
оценка контрольного выражения.1779 Если предложение-1 является выражением, оно считается недействительным
Выражение до первой оценки контроллинга
expression.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
правда.
Это так же, как
for ( counter = counter; counter < fooCnt; counter++ ) {
if (toLower(array[counter].getFooTitle()).find(x) != string::npos) break;
}
например counter
идет от своего текущего значения, увеличиваясь на 1, до fooCnt
, Но если какой-либо из заголовков найден, он останавливается рано.
Я постараюсь объяснить эту строку. Сначала цикл for выглядит следующим образом для (начальная часть; условная часть; часть для следующего шага). Итак, первое; означает, что часть инициализации была пропущена. Обычно после инструкции for выполняется код, который выполняется, но в этом случае он пропускается с двоеточием.
в проверке состояния есть этот код:
counter<fooCnt && (toLower(array[counter].getFooTitle()).find(x)==string::npos)
если условие counter<fooCnt
true, следующий код будет выполнен:
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;
}
}