Две точки с запятой внутри круглых скобок
Я настраиваю код, который нашел в интернете (это чек Adafruit Tweet). Я не могу понять многие части кода, но меня больше всего озадачивает цикл for с двумя точками с запятой в скобках
boolean jsonParse(int depth, byte endChar) {
int c, i;
boolean readName = true;
for(;;) { //<---------
while(isspace(c = timedRead())); // Scan past whitespace
if(c < 0) return false; // Timeout
if(c == endChar) return true; // EOD
if(c == '{') { // Object follows
if(!jsonParse(depth + 1, '}')) return false;
if(!depth) return true; // End of file
if(depth == resultsDepth) { // End of object in results list
Что значит для (;;)? (Это программа Arduino, так что я думаю, это на C).
Ответы
Ответ 1
for(;;) {
}
функционально означает
while (true) {
}
Вероятно, он сломает цикл/возврат из цикла на основе некоторого условия внутри тела цикла.
Причина, по которой for(;;)
петли навсегда, состоит в том, что for
состоит из трех частей, каждая из которых является необязательной. Первая часть инициализирует цикл; второй решает, продолжать или нет цикл, а третий делает что-то в конце каждой итерации. Это полная форма, вы обычно видите что-то вроде этого:
for(i = 0; i < 10; i++)
Если первая часть (инициализация) или последняя (конец-итерация) отсутствуют, на их месте ничего не делается. Если средняя (тестовая) часть отсутствует, то она действует так, как если бы на ней было true
. Итак, for(;;)
совпадает с for(;true;)
', который (как показано выше) совпадает с while (true)
.
Ответ 2
Цикл for
имеет 3 компонента, разделенных полуколониями. Первый компонент запускается до начала цикла и обычно используется для инициализации переменной. Второе условие. Условие проверяется в начале каждой итерации, и если оно оценивается как true, тогда выполняется код в цикле. Третьи компоненты выполняются в конце цикла, прежде чем начинается другая итерация (начиная с проверки состояния) и часто используется для увеличения переменной.
В вашем случае for(;;)
означает, что он будет циклически навечно, так как условие не существует. Цикл заканчивается, когда код return
или break
s.
Ответ 3
Каждое предложение цикла for
является необязательным. Поэтому, когда они исключены, они все еще повторяются. Циклы for
объединяются в циклы while
.
Конечный результат становится проверкой для инициализации любых переменных, которая завершается после того, как ничего не происходит, поскольку она пуста, проверка на логическое условие во втором предложении, которого нет, поэтому цикл начинается, и как только цикл попадает в end check, проверьте, есть ли какой-либо код для запуска, прежде чем снова проверить логическое состояние.
В коде это выглядит так:
while(true){
}
Ответ 4
Здесь Что Wikipedia Говорит Об этом
Использовать как бесконечные циклы
Этот C-стиль for-loop обычно является источником бесконечного цикла, поскольку основные этапы итерации полностью контролируются программистом. Фактически, когда предназначены бесконечные петли, этот тип цикла for может использоваться (с пустыми выражениями), например:
for (;;)
//loop body
Этот стиль используется вместо бесконечных циклов while(1)
, чтобы избежать предупреждения о преобразовании типов в некоторых компиляторах C/С++. Некоторые программисты предпочитают более сжатую форму for(;;)
над семантически эквивалентной, но более подробной формой while (true)
.