Значение, сохраненное во время присвоения символа

#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. Проголосовал за ваш пост, потому что теперь он правильный, и в нем есть код 🙂