Как угадать вывод в этом случае для цикла - PullRequest
0 голосов
/ 21 мая 2019

Почему в одном случае есть выход, а в другом - нет?

int i;
for (;i;)
 {
  printf("Hello  ");
 }

Выход = Привет Привет Привет Привет ....


int i=0;
for (;i;)
 {
  printf("Hello ");
 }

Нет вывода

Ответы [ 4 ]

2 голосов
/ 21 мая 2019

В первом случае i не инициализируется, поэтому поведение не определено.В вашем случае i имеет ненулевое значение, а для вращается без конца, потому что его значение никогда не меняется при печати, но опять же, это поведение не определено.

Inвторой случай i равен 0, поэтому тело для никогда не выполняется

for (;i;) эквивалентно while(i)


Переменная не по умолчанию инициализируется в 0.

Если вы хотите написать, например, 5 раз Hello, вы можете сделать:

 int i;

 for (i = 5 ;i; --i)
 {
   printf("Hello  ");
 }

этот код эквивалентенк тому, используя другую нотацию / оператор, если это может помочь вам понять:

 int i = 5;

 while (i != 0) {
   printf("Hello  ");
   i -= 1;
 }

и добавить putchar('\n'); после цикла для печати новой строки - тоже неплохая идея

1 голос
/ 21 мая 2019

Это неопределенное поведение, поскольку i имеет автоматическую продолжительность хранения и никогда не инициализируется.

Это означает, что доступ к значению в i является неопределенным поведением.Если оно содержит ненулевое значение, то тело цикла for будет всегда истинным (поскольку ничто в цикле не изменяет значение i).

Второй пример явно инициализирует i со значением ноль, что означает, что при использовании в качестве условного выражения оно будет считаться ложным.

0 голосов
/ 21 мая 2019

Первый пример имеет неопределенное поведение.

Часть цикла в коде функционально эквивалентна:

while (i) {
{
    printf("Hello ");
}

Если для i установлено значение 0, выполнение никогда не достигнет printf. Если i никогда не инициализируется, оно может содержать любое значение. Если бы оно оказалось равным 0, оно никогда бы не запустилось, но если оно не равно нулю, цикл будет выполняться вечно.

0 голосов
/ 21 мая 2019

i неинициализирован, поэтому в некоторых случаях i содержит ненулевое число, поэтому; i;Значение true, поэтому условие всегда выполняется как true.

Всегда инициализируйте значения, если они являются целыми числами или символами.это в буквальном смысле ничего не стоит делать с точки зрения производительности, и это экономит так много работы, позже выискивая ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...