@Atljh0987

Почему программа вообще заходит в цикл и почему тут же завершается при присваивании?

Подскажите знающие, почему программа заходит в цикл, если при инициализации в переменной лежит ноль, а это явный false? И почему если не делать присваивание внешней переменной num в переменную WHAAAAAT, то программа запускается, но пишет о завершении на скрине ниже? А если раскоментировать, то работает как надо.
int main(void) {
  int num;
  
  while (num > 0) {
    printf("Введите число\n");
//    int WHAAAAAT = num;
    scanf("%d", &num);
    
    printf("%d недель и %d дней\n", num / 7, num % 7);
  }

  return 0;
}


636ea4db735da990249985.jpeg
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ответы на вопрос 2
Ответ для C++
Не указав инициализатора при объявлении переменной num, вы используете default initialization. Почему? Смотрим по ссылке:
Default initialization is performed in three situations:
1) when a variable with automatic, static, or thread-local storage duration is declared with no initializer;

Это как раз ваш случай.

Далее:
The effects of default initialization are:
......
otherwise, no initialization is performed: the objects with automatic storage duration (and their subobjects) contain indeterminate values.

Итого, согласно третьему описанному случаю, ваша переменная num содержит неопределённое значение (indeterminate value).

Читаем далее:
Use of an indeterminate value obtained by default-initializing a non-class variable of any type is undefined behavior (in particular, it may be a trap representation), except in the following cases:
...

Ваш случай не попадает под исключения, следовательно вы схлопотали undefined behavior.

Что такое undefined behavior? Это значит, что компилятор что хочет, то и генерирует на выходе:
Compilers are not required to diagnose undefined behavior (although many simple situations are diagnosed), and the compiled program is not required to do anything meaningful.

Вывод: не делать так, чтобы в программе был undefined behavior.

Ответ для C
Не указав инициализатора при объявлении переменной num, вы используете implicit initialization. Смотрим по ссылке:
If an initializer is not provided:
- objects with automatic storage duration are initialized to indeterminate values (which may be trap representations)
...

Это как раз ваш случай.

Читаем далее:
If an indeterminate value is used as an argument to any standard library call, the behavior is undefined. Otherwise, the result of any expression involving indeterminate values is an indeterminate value (e.g. int n;, n may not compare equal to itself and it may appear to change its value on subsequent reads)

Итого, у вас либо неопределённое поведение, либо неопределённое значение выражения, если там используется num. Значение в num может даже самопроизвольно меняться между операциями чтения из этой переменной.

Вывод: не делать так, чтобы в программе встречалось использование indeterminate values.
Ответ написан
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Потому что в num мусор. Она обьявлена на куче и в ней может быть любое произвольное значение, нуль может быть, а может быть и нет. Если ломает сделать отдельную инициализацию, смените цикл на for
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы