2013-08-12 2 views
8

Я пытаюсь выполнить приведенную ниже программу.Печать символа целочисленным определителем

#‎include‬ "stdio.h" 
#include "string.h" 

void main() 
{ 
    char c='\08'; 
    printf("%d",c); 
} 

Я получаю вывод как 56. Но для любых чисел, отличных от 8, выход - это номер сам, но для 8 ответ 56.

Может ли кто-нибудь объяснить?

+0

Пожалуйста, поместите код в вопрос (обратите внимание на кнопку ** '{}' ** для ее форматирования) и добавьте осмысленное название. (кнопка редактирования чуть ниже вопроса). – BoBTFish

+0

да простите! Я только что создал эту учетную запись –

+4

Поскольку неопределенное поведение не определено. – molbdnilo

ответ

18

Символы, которые начинаются с \0, представляют собой Octal number, является системой номер 8 и используются цифры 0 to 7. Так \08 является недействительным представления octal числа, потому что 8 ∉ [0, 7], следовательно, вы получаете реализации определенных поведения.

Возможно, ваш компилятор распознать Multibyte Character'\08', как '\0' один символ и '8' в другой и интерпретирует как '\08', как '\0' + '8', что делает его '8'. Посмотрев на ASCII стол, вы заметите, что десятичное значение '8' составляет 56.


Благодаря @DarkDust, @GrijeshChauhan и @EricPostpischil.

+2

GCC и clang оба жалуются, что это многосимвольная константа, поэтому кажется, что они интерпретируют ее как символ '\ 0' + '8'. И действительно, '8' == ASCII десятичный 56. – DarkDust

+0

gcc 4.6.3 не жалуется. – Oswald

+0

@ Oswald: попробуйте '-Wmultichar' (который по умолчанию на моей машине включен). – DarkDust

4

\0 используется для представления восьмеричных чисел в C/C++. Восьмеричные базовые цифры от 0->7 так \08 является мульти-символьная константа, состоящая из \0, компилятор интерпретирует \08, как \0 + 8, что делает его '8' которого значение ASCII 56. Вот почему вы получаете 56 как выход.

+0

Umer '' \ 08'' должен быть не определен, определяется реализацией –

+0

http://ideone.com/Kgifgy не дает 56 –

4

Как и другие ответы, эти числа представляют восьмеричные символы (основание 8). Это означает, что вы должны написать '\010' для 8, '\011' для 9 и т.д.

Есть другие способы, чтобы написать свой Присвоить:

char c = 8; 
char c = '\x8'; // hexadecimal (base 16) numbers 
+0

@Roddy - Неверно. В C/C++ '0' в качестве префикса для числового литерала обозначает восьмеричную нотацию - не двоичную. –

7

Значение '\08' считается постоянной нескольких символов, состоящий из \0 (который оценивает число 0) и символ ASCII 8 (который оценивает до десятичного числа 56). Как это интерпретируется, определяется реализация. В стандарте C99 говорится:

Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы , содержащей один символ, который сопоставляется с однобайтовым символом выполнения , представляет собой числовое значение представления отображаемого символа, интерпретируемого как целое число, . значение константы целого числа символов, содержащей более одного характера (например, «аb»), или содержащей символ или избежать последовательностей , что не отображают до выполнения символа одного байта, является реализацией определенной.Если целочисленная символьная константа содержит одиночный символ или escape-последовательность , то его значение равно , когда объект с типом char, значение которого является значением одного символа или escape-последовательности, преобразуется в тип int.

Так что, если вы бы назначить '\08' что-то большее, чем char, как int или long, даже было бы действительным. Но поскольку вы назначаете его char, вы «отрубаете» какую-то часть. Какая часть, вероятно, также зависит от реализации/машины. В вашем случае это дает вам значение 8 (символ ASCII, который оценивает число 56).

Как GCC, так и Clang предупреждают об этой проблеме с помощью «предупреждение: многосимвольная символьная константа».

+0

Для записи: Visual C++ 2010 предупреждает «предупреждение C4125: десятичная цифра завершает восьмеричную escape-последовательность», но вы должны установить/W4 (уровень предупреждения), где/W3 является значением по умолчанию. – Wacek

Смежные вопросы