Почему%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 символ заменяется в этом месте в строке печати.

Другие вопросы по тегам