Почему% c печатает '?'и каково его значение - PullRequest
0 голосов
/ 20 февраля 2019

Два примера

printf("\n %c , ((unsigned char)a[i]+100);

printf("\n %c , -11);

Возвращает

?
?

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

"%c" ожидает int.

(unsigned char)a[i]+100 - (unsigned char) + (int).Когда (unsigned char) является 8-разрядным (наиболее распространенным), это приводит к int.Таким образом, в обоих приведенных ниже кодовых кодах от int до printf().

printf("\n %c , ((unsigned char)a[i]+100);
printf("\n %c , -11);

"%c" преобразуется этот int в unsigned char.

c ... аргумент int преобразуется в unsigned char, и результирующий символ записывается.C11dr §7.21.6.1 8

Предполагая 8-битовое unsigned char, это преобразованное значение находится в диапазоне от 0 до 255. -11 становится 245. Затем записывается символ.Для значений в диапазоне ASCII от 0 до 127 мы обычно видим символ ASCII или эффект управляющего символа.Другие значения печатают другие вещи.

Конечно, на платформе OP выход по умолчанию равен ? для многих из этих символов вне диапазона ASCII. @ Пэдди

0 голосов
/ 20 февраля 2019

Как вы уже догадались, c возвращает символ.Это означает, что в %c символ заменяется в этом месте строки печати. ​​

0 голосов
/ 20 февраля 2019

Символ -11 не является допустимым 7-битным символом ASCII.Это также недопустимый байт UTF-8, следовательно, результат ?.

Только символы 0-127 действительны для %c.Все остальное будет частью многобайтового символа UTF-8 или зависит от набора символов.

0 голосов
/ 20 февраля 2019

Вы пропускаете закрытие "в обоих выражениях. Какой компилятор вы используете? Если вы скомпилируете с помощью gcc с флагом -Wall, вы увидите:

warning: missing terminating " character
     printf("\n %c , ((unsigned char)a[i]+100);
...