Почему%c печатает '?' и каково его значение
Два примера
printf("\n %c , ((unsigned char)a[i]+100);
printf("\n %c , -11);
Возвращает
?
?
4 ответа
Символ -11 не является допустимым 7-битным символом ASCII. Это также недопустимый байт UTF-8, следовательно, ?
результат.
Только символы 0-127 действительны для %c
, Все остальное будет частью многобайтового символа UTF-8 или зависит от набора символов.
В обоих выражениях вы пропускаете закрывающее ". Какой компилятор вы используете? Если вы скомпилируете с помощью gcc с флагом компилятора -Wall, вы увидите:
warning: missing terminating " character
printf("\n %c , ((unsigned char)a[i]+100);
"%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-диапазона. @Пэдди
Ты угадал, c
возвращает символ Это означает, что в %c
символ заменяется в этом месте в строке печати.