Что произойдет, если условие не будет передано в цикл For?

#c #loops #for-loop #int

#c #циклы #for-цикл #int

Вопрос:

Рассмотрим этот фрагмент:

 int numbers[9] = {5, 2, 78, 23, 8, 9, 3, 12, 97};
int arrLength = (sizeof(numbers) / sizeof(int));

for(int i = 0; arrLength; i  ) {
    printf("%dn", numbers[i]);
}
  

Я задал длину массива в качестве второго параметра цикла, но не задал ему условия для остановки. Выход выдал 9 чисел внутри моего массива, а затем продолжил. Вот пример вывода программы. Таким образом программа легко выводит более 100 цифр. Кто-нибудь может объяснить, что происходит?

введите описание изображения здесь

Комментарии:

1. Вы предоставили условие; вы просто использовали сокращение для arrLength != 0 . Исключение условия будет выглядеть следующим образом: for (int i = 0; ; i ) . Это бесконечный цикл; отсутствующее условие рассматривается как всегда истинное.

Ответ №1:

В этом случае условие предоставляется.

  for(int i = 0; arrLength; i  )
  

это то же самое, что

 for(int i = 0; arrLength != 0; i  )
  

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

Из C11 , глава 6.8.5, Стр. 4

Оператор итерации вызывает повторное выполнение оператора, называемого телом цикла, до тех пор, пока управляющее выражение не сравняется с равным 0. […]

и, сноска 158, for цикл

[…] управляющее выражение, expression-2, определяет оценку, выполняемую перед каждой итерацией, так что выполнение цикла продолжается до тех пор, пока сравнение выражения не будет равно 0; […]

В случае, если условие не задано, оно считается ненулевым (всегда истинное значение).

Глава 6.8.5.3, параграф 2

Как предложение-1, так и выражение-3 могут быть опущены. Пропущенное выражение-2 заменяется ненулевой константой.

Комментарии:

1. Кажется, я создал бесконечный цикл. Но в конечном итоге программа завершается. Связано ли это с тем, что на компьютере исчерпана память? Мой диспетчер задач не показывает никакого всплеска памяти.

2. @KeplerIO И это еще не все: неконтролируемое увеличение счетчика вызовет переполнение, а учитывая, что счетчик имеет тип signed integer , это вызовет неопределенное поведение.