Подтвердить что ты не робот

Может ли цикл for иметь назначение в его заявлении?

Я столкнулся с этим синтаксисом

for (string st; getline(is, st, ' '); v.push_back(st)); 
        ^                  ^                  ^
    initialization   condition, increment    ???

Как v.push_back(st) работает как приращение, когда оно покрывается getline(is, st, ' ')?

4b9b3361

Ответ 1

Это эквивалентно:

for (string st; getline(is, st, ' '); )
    v.push_back(st);

или

{
    string st;
    while (getline(is, st, ' '))
        v.push_back(st);
}

Дело в том, что оператор increment выполняется в конце тела цикла каждый раз, когда выполняется условие. Итак, вы можете видеть это как самую последнюю инструкцию тела.

Иногда вы можете оставить инструкцию increment пустой; в этом случае вместо инструкции приращения вы помещаете единственную инструкцию тела.

Ответ 2

Из стандарта:

 for ( init-statement condition(optional) ; iteration_expression(optional) ) statement

iteration_expression - любое выражение, которое выполняется после каждого итерации цикла и перед переоценкой. Как правило, это выражение, которое увеличивает счетчик циклов

Приведенный выше синтаксис дает код, эквивалентный:

{
    init_statement; 
    while ( condition ) { 
        statement;
        iteration_expression; 
    }
}

Таким образом, это не должно быть приращение.

Ответ 3

Он ничего не увеличивает. Цикл for завершается, когда условие условия не выполняется. Поэтому, когда getline возвращает значение false, цикл завершается.

Во многих случаях операция действительно увеличивает переменную, и условие, вероятно, проверяет, не превышает ли эта переменная предел. Не позволяйте этому путать вас, просто помните, что цикл for имеет следующую (общую) структуру:

for (init; condition; operation)

Ответ 4

Это не должно быть выражением приращения. То, что ожидается от этого, определяется вами. Код такой же, как и семантически.

string st;                       // run before the loop and only once
while (getline(is, st, ' ')) {   // condition used to determine the loop should continue or break
    v.push_back(st);             // run every time inside the loop
}

Ответ 5

Ответ: он не работает как приращение.

Цикл for будет иметь тот же результат, что и цикл while ниже:

string st;
while (getline(is, st, ' '))
{
    v.push_back(st);
}

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

Ответ 6

Как v.push_back(st) работает как приращение, когда оно покрывается getline(is, st, ' ')?

Это не так. Вы неправильно поняли (или ошиблись) конструкцию цикла for.

Вот его компоненты:

  • утверждение, которое должно быть оценено до начала цикла;
  • выражение, которое должно быть оценено в начале каждой итерации, которое будет отменено, если выражение преобразуется в boolean false;
  • не декларативный оператор, который должен быть оценен в конце каждой итерации.

Что это.

Нет ничего, чтобы диктовать, какие (если они есть!) этих компонентов выполняют приращение. Рассмотрим общий пример for (;;) & hellip; никаких операций здесь вообще, не говоря уже о приращении!

Ответ 7

Этот цикл будет выполняться, пока getline возвращает поток без ошибок (посмотрите operator bool). На каждой итерации st будет нажата на v. Я бы переписал это с точки зрения цикла while:

string st;
while(getline(is, st, ' '))
{
    v.push_back(st)
}

Ответ 8

Все, что имеет значение, - это то, что конечное состояние кода в блоке условий имеет значение. Это значение сравнивается с нулем, а если ноль, цикл for не вводится. По существу, в старые добрые, небольшие программные дни telco, использующие C и Unix, содержимое Accumulator оценивалось для нулевого состояния, проверяя флаг "Z'ero" после того, как был выполнен код в блоке условий.

Ответ 9

v.push_back (st) - это функция, выполняющая операцию над параметром 'st'. однако операция, согласно вашему вопросу, не показана. Поэтому мы не можем определить, имеет ли он прирост. Но тогда синтаксис очень возможен!!!