Пожалуйста, объясните, почему вывод программы равен 0 (программирование на c)

#c #variables #default-value

Вопрос:

Код: #включить <stdio.h>

 int main()
{
    int x;

    printf("%dn",x);
    if(x>10)
      x-=10;
    else if(x>=0)
      x =00;
    else if(x)
      x =10;
    else
      x-=10;
      printf("%dn",x);
    return 0;
}
 

Почему начальное значение x равно нулю? каково значение по умолчанию для данных типа int, float, double, char в c. В этой программе x присваивается значение по умолчанию или значение мусора.

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

1. Неопределенное поведение-вот почему.

2. Неопределенное поведение. x может иметь любое значение, включая 0.

3. Вы должны скомпилировать с -Wall -Wextra

4. Последний печатный файл имеет неверный отступ

Ответ №1:

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

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

1. Не случайный , но неопределенный . И это верно только для локальных автоматических переменных. Глобальные и статические переменные автоматически инициализируются 0.

2. Чтобы быть еще более конкретным, это все, что было в стеке в тот момент , зависит от потока вашей программы, оптимизации компилятора и от того, какая программа использовала этот сегмент памяти до вас (включая ваш собственный динамический компоновщик).

3. @Adalcar Не обязательно, но вероятно. Компилятору C разрешено инициализировать переменные до 0 (или другого значения), если он этого хочет.

4. Это гораздо хуже, чем «случайно». Компилятор, по сути, может свободно извлекать любое значение всякий x раз, когда оно используется. Он мог бы даже исключить все ветви в примере или просто выбрать самую дешевую, так как это дало бы лучший код.

5. @Adalcar, Нет, его не нужно никуда выделять. В спецификации C даже не упоминается понятие «стек». Локальная переменная существует только как символ в уравнениях, представляющих преобразование между состояниями программы. Компилятор может делать все с такой сущностью, пока побочные эффекты программы одинаковы. В случае UB даже ограничение «побочные эффекты» не должно выполняться.