Почему встроенные коды C заканчиваются на "while(1)"?
Я всегда вижу while(1); в конце кодов C, таких как:
#include <stdio.h>
int main(void)
{
//Некоторый код здесь...
while(1);
}
Если я не ошибаюсь, что он всегда существует, какова его функция?
изменить:
#include <stdio.h>
int main(void)
{
while(1);
//Некоторый код здесь...
}
@GNZ, 👍-1
Обсуждение3 ответа
Это потому, что в невстроенных системах, когда main()
завершает работу, он возвращается в операционную систему, и программа удаляется из памяти. Во встроенных системах нет операционной системы, к которой можно было бы вернуться, и программа не может быть удалена из памяти. Итак... что вы делаете, когда программа закончена? Просто: вы ничего не делаете. Навсегда. Именно это и делает while(1);
.
Некоторые компиляторы и библиотеки C автоматически добавляют while(1);
в подпрограмму exit()
, но не все, поэтому лучше сделать это явно, чем полагаться на чем-то, что может быть, а может и не быть.
Это также очень запутанно с точки зрения синтаксиса. "Пока" используется с фигурными скобками. Но здесь в конце есть while(1);. Как мы можем сформулировать это, чтобы понять, как это работает в коде?, @GNZ
while
, как и if
, *можно* использовать с фигурными скобками. Это не должно быть. пока(что-то) делать что-то();
и пока(что-то) { делать что-то(); }
одинаковы. Скобки *нужны* только в том случае, если вы хотите сделать более одной вещи., @Majenko
Означает ли это (для вечного цикла), в то время как (1) может быть в верхней части кода, а не в конце?, @GNZ
Вы можете использовать его где угодно. Вы также иногда видите for (;;);
, что означает то же самое... "навсегда...", @Majenko
Чтобы быть более конкретным. Пожалуйста, смотрите мое редактирование. Я добавил еще один код в свой вопрос. Эти два кода будут действовать одинаково?, @GNZ
while(1) ничего не будет делать вечно. Ключ здесь: *навсегда*. Он никогда не перестанет ничего не делать. Любой код после него никогда не будет выполнен, потому что он по-прежнему ничего не делает., @Majenko
while(1);
на самом деле следует читать как
while(true)
{
// Без операторов
}
// Операторы, следующие здесь, никогда не будут выполняться
Результат: пока условие истинно, оно не выполняет никаких операторов. Поскольку условие true
всегда истинно, оно продолжает выполнять операторы внутри { и }, которые не являются операторами, в результате чего оператор не выполняется, но он также не будет выполнять операторы через некоторое время.
«Пока» обычно используется с фигурными скобками. Но здесь в конце есть while(1);. Как мы можем сформулировать это, чтобы понять, как это работает в коде?, @GNZ
Маженко уже ответил на это примерно такими же словами: в то время как (истина) <X>, где х может быть одним утверждением, например, в то время как (истина) а = 4; (таким образом, a = 4; это утверждение). Или это может быть составное (несколько утверждений) в виде while (true) { a = 4; б = 5; }. В случае вашего вопроса используется один (но пустой) оператор: while (true) /* пустой оператор */ ;, @Michel Keijzers
Может ли while(1) находиться вверху кода, а не в конце? Будет ли это работать так же? Я не понимаю, почему они поставили его в самом конце, а не в самом начале., @GNZ
Это может быть где угодно в коде, однако обратите внимание, что код после такого оператора while больше не будет выполняться, поскольку MCU продолжает выполнять… ничего., @Michel Keijzers
Вы написали, что «код после такого оператора while больше выполняться не будет». Если код после while(1) не будет выполняться, то как же поставить while(1); в начале позволит следующему коду зацикливаться навсегда?, @GNZ
@Genzo Я имел в виду, что после полного оператора while ... все операторы в скобках (в то время как (…) {…}) принадлежат оператору while; оператор while заканчивается после ; (in while (1);) или после } (in while (1) {…}). Заявления после ; или } не будет выполняться., @Michel Keijzers
Чтобы быть более конкретным. Пожалуйста, смотрите мое редактирование. Я добавил еще один код в свой вопрос. Эти два кода будут действовать одинаково?, @GNZ
Нет, они не одинаковы. Первый выполняет <какой-то код здесь>, а затем ожидает неопределенное время. Второй ожидает неопределенное время, а затем выполняет <здесь какой-то код> (то есть **никогда**)., @Gerben
Они не будут работать одинаково: в первом примере сначала выполняются операторы (здесь какой-то код), а MCU продолжает ничего не делать (пока), во втором примере MCU начинает ничего не делать (пока), никогда не достигая операторы (некоторый код здесь)., @Michel Keijzers
Строка while(1) в программе на языке C создает бесконечный цикл — цикл, который никогда не прекращает свое выполнение. Он выполняется снова и снова и снова, если только программа не остановлена намеренно или в этом цикле не выполняется какое-то условие, которое выводит программу из этого бесконечного цикла.
Возьмем следующую программу на C.
включить
пустой основной() { printf("Привет, мир"); пока (1);
Эта программа выводит слова "Hello World" на стандартный вывод, который, скорее всего, является последовательным портом.
После того, как он напечатает его, он переходит к выполнению следующей строки, в то время как (1). Эта строка заставляет микроконтроллер сидеть и ждать вечно или до тех пор, пока микроконтроллер не будет сброшен.
- В чем разница/связь между Arduino и AVR?
- Как преобразовать скетч примера Arduino в полный проект C++?
- Не удается записать загрузчик через Arduino Nano clone ISP в atmega328p
- Поскольку double и float представляют один и тот же тип данных (обычно), что предпочтительнее?
- Как создать задержки на языке ассемблера AVR
- Программирование микроконтроллера Attiny85 без arduino
- AVR (Arduino Uno) Serial.print и Serial.println печатают только 1 или 2 символа
- Прерывание переполнения таймера AVR не работает
;
- пустая команда. это ничего не повторяется св то время как (1)
, @JurajНу, чтобы быть педантичным, вам не разрешено иметь такие циклы в программе C или C++. В C и C++ требуется бесконечный цикл для наблюдаемого поведения (ввод/вывод, атомарный доступ, изменчивый доступ и т. д.). Если бесконечный цикл не имеет такого поведения (например, пустой цикл), поведение вашего кода не определено. На практике компиляторы могут (и будут) полностью исключать такие циклы из кода, а это означает, что программа на этом не остановится. Единственная причина, по которой это «работает» в AVR-GCC, заключается в том, что это своего рода идиома во встроенном программировании, поэтому они разрешены в качестве исключения., @AnT