Понимание стенографии переполнения стека

У меня есть этот код в моей книге C ++, и я не уверен, что этот код означает:

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

Это все в одной строке. Есть ли другой способ написания этого кода? Я также не понимаю, почему есть «;» перед переменной в начале цикла for ….

1

Решение

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.

5

Другие решения

Вы могли бы написать это так

 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 правда.

3

Это так же, как

for ( counter = counter; counter < fooCnt; counter++ ) {
if (toLower(array[counter].getFooTitle()).find(x) != string::npos) break;
}

например counter идет от своего текущего значения, увеличиваясь на 1, до fooCnt, Но если какой-либо из заголовков найден, он останавливается рано.

2

Я постараюсь объяснить эту строку. Сначала цикл for выглядит следующим образом для (начальная часть; условная часть; часть для следующего шага). Итак, первое; означает, что часть инициализации была пропущена. Обычно после инструкции for выполняется код, который выполняется, но в этом случае он пропускается с двоеточием.

в проверке состояния есть этот код:

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

если условие counter<fooCnt true, следующий код будет выполнен:

toLower(array[counter].getFooTitle()).find(x)==string::npos

по крайней мере после каждого цикла счетчик увеличивается.

counter++
1

Есть ли другой способ написания этого кода?

Это может быть яснее, как

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

то есть пока мы не достигли предела, а также мы не нашли x, перейти к следующему. Эквивалентно, цикл, пока мы не достигнем предела или же мы нашли x,

Я также не понимаю, почему есть «;» перед переменной в начале цикла for

for утверждение имеет три пункта, как в

for (int i = 0; i < n; ++i)

Первый объявляет и / или инициализирует переменные, которые будут использоваться в цикле — он может быть пустым, если, как здесь, вам не нужны никакие. Второе оценивается перед каждой итерацией, чтобы решить, следует ли продолжить — оно может быть пустым, если вы всегда хотите продолжить. Третий оценивается после каждой итерации — он может быть пустым, если между итерациями нечего обновлять.

1

Да, это довольно уродливо. Я бы сломал это немного.

int i = 0;
for(; i < fooCnt; ++i) {
auto lowcase = toLower(array[i].getFooTitle());
if(lowcase.find(x) != string::npos) {
break;
}
}
1
По вопросам рекламы [email protected]