#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 даже ограничение «побочные эффекты» не должно выполняться.