#c #printf
#c #printf
Вопрос:
Для приведенного ниже фрагмента кода
int main()
{
char a=a;
printf("%d",a);
}
Почему вывод приведенного выше кода равен 8?
Если я изменю %d
на %c
, он ничего не печатает.
Ответ №1:
char a = a;
это самоинициализация, которая в основном совпадает с отсутствием инициализации вообще. Следовательно, значение a не определено. На практике его значение определяется тем, что ранее хранилось в памяти в месте расположения переменной.
Числовое значение буквы a в ASCII или Unicode равно 97. Число 8 — это просто произвольный мусор. Компилятор, если бы он уважал себя, выдал бы вам ошибку времени компиляции, а не просто предупреждение.
Как бы то ни было, вы, вероятно, даже не получили предупреждения — .-
Ответ №2:
Вы должны назначить его следующим образом:
char a = 'a';
В настоящее время, если оно char a = a;
не определено, что приводит к 8.
Вот почему он не печатает его, когда вы это делаете printf("%c",a);
Исправленный код будет:
int main()
{
char a = 'a';
printf("%c", a);
return 0;
}
Комментарии:
1.
char a=a;
должен выдать предупреждение компилятору. «он помещает числовое значение a, равное 8». неверно.a
неинициализирован, так что это мусор. (Вопрос также заключается в том, объявлен лиa
он уже, когда он используется в качестве инициализатора автоматической переменной, а именно itsel .)2. К сожалению, clang в настройках по умолчанию этого не делает. Эти люди из C и C не уважают свой язык или свои инструменты вообще…
3. Исправлено @PaulOgilvie
4. Интересно, как неаккуратные люди, работающие на C, и радикально строгие люди Swift ладят внутри проекта llvm: D
5. Проголосовал за ваш пост, потому что теперь он правильный, и в нем есть код 🙂