для цикла отсутствует инициализация - PullRequest
8 голосов
/ 25 сентября 2010

Я видел

for(;;)

и

for ( ; *s != '\0'; s++)

Почему так пусто? Спасибо.

Ответы [ 6 ]

22 голосов
/ 25 сентября 2010

Оператор for работает следующим образом:

for (initialization; test-condition; update)

И любой из этих трех или все они могут быть опущены (оставлено пустым).Итак:

  • for (;;) - это бесконечный цикл 1 , эквивалентный while (true), потому что нет условия проверки.Фактически, for (int i=0; ;i++) также будет бесконечным циклом 1 .

  • for ( ; *s != '\0'; s++) является циклом без инициализации.s будет указывать на начало (вероятно) строки и будет увеличиваться до тех пор, пока не достигнет нулевого символа '\0', обозначающего конец строки.По сути, это означает цикл по всем символам строки s

1 Цикл все равно будет прерван, если в теле цикла есть оператор break,или позвоните на номер exit() и т. д.

6 голосов
/ 25 сентября 2010

Это "пусто как это", потому что автор кода оставил это поле пустым. Автор не хотел / не должен ничего делать в соответствующем разделе оператора for, поэтому он был оставлен пустым.

for (;;) - это оператор, который повторяется бесконечно (если только он не прерывается изнутри тела цикла).

for ( ; *s != '\0'; s++) - это оператор, который не нуждается в разделе инициализации, поскольку все необходимое (например, начальное значение s) уже было инициализировано до этого for оператора.

4 голосов
/ 25 сентября 2010

for(;;) - бесконечный цикл. По сути, это то же самое, что и while (true).

Причина, по которой это работает, заключается в том, что когда среднее условие в цикле for пусто, оно интерпретируется как всегда истинное.

for ( ; *s != '\0'; s++) используется для чтения строк за символом. Этот подход работает, потому что каждая строка C заканчивается нулевым символом (\0).

2 голосов
/ 25 сентября 2010

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

for ( ; *s != '\0'; s++)

- это просто обычный цикл без какого-либо выражения инициализации. Это зависит от того факта, что s уже имеет начальное значение и просто зацикливается, пока не достигнет конца строки.

1 голос
/ 13 мая 2011

while(1) и while(true) совпадают с for(;;)

1 голос
/ 25 сентября 2010

это означает, что делать навсегда

для (начальное условие; приращение; конечное условие);Вы можете опустить любое из этих

См. http://en.wikipedia.org/wiki/For_loop

Три управляющих выражения, разделенные здесь точкой с запятой, слева направо - выражение инициализатора, тест циклавыражение и счетное выражение.Инициализатор вычисляется ровно один раз в самом начале цикла.Тестовое выражение цикла вычисляется в начале каждой итерации цикла и определяет, когда цикл должен завершиться.Наконец, подсчетное выражение оценивается в конце каждой итерации цикла - даже если вызывается continue - и обычно отвечает за изменение переменной цикла.

В большинстве языков, которые предоставляют этот тип цикла for, каждый изтри выражения цикла управления не являются обязательными.Если опущено, выражение теста цикла считается всегда истинным, в то время как выражения инициализатора и подсчета обрабатываются как no-ops, если опущены.Точки с запятой в синтаксисе достаточны для обозначения пропуска одного из выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...