Почему встроенные коды C заканчиваются на "while(1)"?

avr

Я всегда вижу while(1); в конце кодов C, таких как:

#include <stdio.h>


int main(void)
{

    //Некоторый код здесь...

    while(1);

}

Если я не ошибаюсь, что он всегда существует, какова его функция?

изменить:

#include <stdio.h>


int main(void)
{


     while(1);
    //Некоторый код здесь...



}

, 👍-1

Обсуждение

; - пустая команда. это ничего не повторяется с в то время как (1), @Juraj

Ну, чтобы быть педантичным, вам не разрешено иметь такие циклы в программе C или C++. В C и C++ требуется бесконечный цикл для наблюдаемого поведения (ввод/вывод, атомарный доступ, изменчивый доступ и т. д.). Если бесконечный цикл не имеет такого поведения (например, пустой цикл), поведение вашего кода не определено. На практике компиляторы могут (и будут) полностью исключать такие циклы из кода, а это означает, что программа на этом не остановится. Единственная причина, по которой это «работает» в AVR-GCC, заключается в том, что это своего рода идиома во встроенном программировании, поэтому они разрешены в качестве исключения., @AnT


3 ответа


2

Это потому, что в невстроенных системах, когда main() завершает работу, он возвращается в операционную систему, и программа удаляется из памяти. Во встроенных системах нет операционной системы, к которой можно было бы вернуться, и программа не может быть удалена из памяти. Итак... что вы делаете, когда программа закончена? Просто: вы ничего не делаете. Навсегда. Именно это и делает while(1);.

Некоторые компиляторы и библиотеки C автоматически добавляют while(1); в подпрограмму exit(), но не все, поэтому лучше сделать это явно, чем полагаться на чем-то, что может быть, а может и не быть.

,

Это также очень запутанно с точки зрения синтаксиса. "Пока" используется с фигурными скобками. Но здесь в конце есть while(1);. Как мы можем сформулировать это, чтобы понять, как это работает в коде?, @GNZ

while, как и if, *можно* использовать с фигурными скобками. Это не должно быть. пока(что-то) делать что-то(); и пока(что-то) { делать что-то(); } одинаковы. Скобки *нужны* только в том случае, если вы хотите сделать более одной вещи., @Majenko

Означает ли это (для вечного цикла), в то время как (1) может быть в верхней части кода, а не в конце?, @GNZ

Вы можете использовать его где угодно. Вы также иногда видите for (;;);, что означает то же самое... "навсегда...", @Majenko

Чтобы быть более конкретным. Пожалуйста, смотрите мое редактирование. Я добавил еще один код в свой вопрос. Эти два кода будут действовать одинаково?, @GNZ

while(1) ничего не будет делать вечно. Ключ здесь: *навсегда*. Он никогда не перестанет ничего не делать. Любой код после него никогда не будет выполнен, потому что он по-прежнему ничего не делает., @Majenko


0
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


0

Строка while(1) в программе на языке C создает бесконечный цикл — цикл, который никогда не прекращает свое выполнение. Он выполняется снова и снова и снова, если только программа не остановлена намеренно или в этом цикле не выполняется какое-то условие, которое выводит программу из этого бесконечного цикла.

Возьмем следующую программу на C.

включить

пустой основной() { printf("Привет, мир"); пока (1);

Эта программа выводит слова "Hello World" на стандартный вывод, который, скорее всего, является последовательным портом.

После того, как он напечатает его, он переходит к выполнению следующей строки, в то время как (1). Эта строка заставляет микроконтроллер сидеть и ждать вечно или до тех пор, пока микроконтроллер не будет сброшен.

,