2013-08-12 4 views
8

아래 프로그램을 실행하려고합니다.정수 한정자로 문자 인쇄

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

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

출력이 56으로 표시됩니다. 그러나 8 이외의 숫자의 경우 출력은 숫자 자체이지만 8의 경우 대답은 56입니다.

누군가 설명 할 수 있습니까?

+0

은 (유의 **'{}'** 버튼을 포맷하는) 질문에 코드를 넣어 주시고 의미있는 제목을 추가합니다. (질문 바로 아래에있는 버튼 편집). – BoBTFish

+0

예, 죄송합니다! 방금이 계정을 만들었습니다 –

+4

정의되지 않은 동작이 정의되지 않았기 때문에. [나 strlen - 때때로 1 씩 증가되는 문자열의 길이] – molbdnilo

답변

18

\0으로 시작하는 문자는 Octal number을 나타내며, 밑수 8 숫자 체계이며 숫자 0 to 7을 사용합니다. 그래서 \08무효 표현 octal 수입니다 8 ∉ 때문에 [0, 7], 따라서 당신이 구현 정의 동작을 받고 있습니다.

아마 당신의 컴파일러는 Multibyte Character'\08' 다른 같은 '8' 문자 하나 '\0'로하고을 인식하고 '8'하게하는 등 '\08''8' + '\0'로 해석합니다. ASCII 테이블에보고 한 후에는 '8'의 진수 값이 @DarkDust, @GrijeshChauhan 및 @EricPostpischil에 56


감사는 것을 알게 될 것이다.

+2

GCC와 clang은 둘 다 멀티 문자 상수라는 불평을하므로 '\ 0'+ '8'문자로 해석됩니다. 그리고 실제로 '8'== 아스키 10 진수 56. – DarkDust

+0

gcc 4.6.3은 불평하지 않습니다. – Oswald

+0

@Oswald :'-Wmultichar'를 시도하십시오 (내 컴퓨터에서 기본적으로 켜져있는 것 같습니다). – DarkDust

4

\0은 C/C++의 8 진수를 나타내는 데 사용됩니다. 8 진수는 0->7입니다. 따라서 \08\0으로 구성된 복수 문자 상수입니다. \08\0 + 8으로 해석되므로 ASCII 값이 56'8'이됩니다. 그 이유는 56을 출력으로 가져 오는 이유입니다.

+0

Umer ''\ 08'' 정의되지해야한다, 구현 정의 56 –

+0

http://ideone.com/Kgifgy을 - 잘못된. C/C++에서 숫자 리터럴의 접두어로 '0'은 8 진수가 아니라 2 진법을 나타냅니다. 기록을 위해 –

4

다른 답변에서 말한 것처럼 이러한 종류의 숫자는 8 진수 문자 (기본 8)를 나타냅니다. 이것은 당신이 8 '\010', 9 '\011'를 작성해야한다는 것을 의미 등

당신의 할당을 작성하는 다른 방법이 있습니다

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

@Roddy를 제공하지 않습니다 –

7
'\08'멀티 문자 상수로 간주됩니다

\0 (숫자 0으로 평가됨) 및 ASCII 문자 8 (십진수 56으로 평가됨)으로 구성된입니다. 해석 방법은 구현 정의입니다. C99 표준은 다음과 같이 말합니다.

정수형 상수는 int 유형입니다. 단일 바이트 실행 문자로 매핑되는 단일 문자를 포함하는 문자 상수의 값은 매핑 된 문자의 표현의 정수로 해석되는 숫자 값입니다. (예 : 'AB'는) 또는 문자를 포함하거나 단일 바이트 실행 문자에 매핑되지 않는 서열 탈출 을 구현 정의되는 하나 개 이상의 문자를 포함하는 정수 문자 상수의 값.정수 문자 상수는 단일 문자를 포함하거나 순서를 벗어날 경우 그 값이 을 초래 한 경우에는 값이 단일 캐릭터 그 또는 이스케이프 시퀀스 INT 유형으로 변환되어 입력 문자와 객체. 당신이 int 또는 long처럼 char보다 큰 무언가에 '\08'을 할당 할 경우

그래서, 심지어는 유효 할 것이다. 그러나 당신이 char에 그것을 할당했기 때문에 당신은 어떤 부분을 잘게됩니다. 어떤 부분은 또한 구현/기계에 따라 달라질 수 있습니다. 귀하의 경우에는 8 (숫자 56으로 평가되는 ASCII 문자) 값을 제공합니다. "일정한 멀티 문자 문자 경고"

모두 GCC와 연타는 이 문제에 대해 경고 않습니다.

+0

: ": 소수점 자리 8 진수 이스케이프 시퀀스를 종료 C4125 경고",하지만 당신은/W3 기본입니다/W4 (경고 수준) 옵션을 설정해야합니다 비주얼 C++ 2010로 경고합니다. – Wacek