#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 , это вызовет неопределенное поведение.