아래 프로그램을 실행하려고합니다.정수 한정자로 문자 인쇄
#include "stdio.h"
#include "string.h"
void main()
{
char c='\08';
printf("%d",c);
}
출력이 56
으로 표시됩니다. 그러나 8
이외의 숫자의 경우 출력은 숫자 자체이지만 8
의 경우 대답은 56
입니다.
누군가 설명 할 수 있습니까?
아래 프로그램을 실행하려고합니다.정수 한정자로 문자 인쇄
#include "stdio.h"
#include "string.h"
void main()
{
char c='\08';
printf("%d",c);
}
출력이 56
으로 표시됩니다. 그러나 8
이외의 숫자의 경우 출력은 숫자 자체이지만 8
의 경우 대답은 56
입니다.
누군가 설명 할 수 있습니까?
\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
감사는 것을 알게 될 것이다.
\0
은 C/C++의 8 진수를 나타내는 데 사용됩니다. 8 진수는 0->7
입니다. 따라서 \08
은 \0
으로 구성된 복수 문자 상수입니다. \08
은 \0
+ 8
으로 해석되므로 ASCII 값이 56
인 '8'
이됩니다. 그 이유는 56
을 출력으로 가져 오는 이유입니다.
Umer ''\ 08'' 정의되지해야한다, 구현 정의 56 –
http://ideone.com/Kgifgy을 - 잘못된. C/C++에서 숫자 리터럴의 접두어로 '0'은 8 진수가 아니라 2 진법을 나타냅니다. 기록을 위해 –
다른 답변에서 말한 것처럼 이러한 종류의 숫자는 8 진수 문자 (기본 8)를 나타냅니다. 이것은 당신이 8 '\010'
, 9 '\011'
를 작성해야한다는 것을 의미 등
당신의 할당을 작성하는 다른 방법이 있습니다
char c = 8;
char c = '\x8'; // hexadecimal (base 16) numbers
@Roddy를 제공하지 않습니다 –
'\08'
은
멀티 문자 상수로 간주됩니다
\0
(숫자 0으로 평가됨) 및 ASCII 문자 8
(십진수 56으로 평가됨)으로 구성된입니다. 해석 방법은 구현 정의입니다. C99 표준은 다음과 같이 말합니다.
정수형 상수는 int 유형입니다. 단일 바이트 실행 문자로 매핑되는 단일 문자를 포함하는 문자 상수의 값은 매핑 된 문자의 표현의 정수로 해석되는 숫자 값입니다. (예 : 'AB'는) 또는 문자를 포함하거나 단일 바이트 실행 문자에 매핑되지 않는 서열 탈출 을 구현 정의되는 하나 개 이상의 문자를 포함하는 정수 문자 상수의 값.정수 문자 상수는 단일 문자를 포함하거나 순서를 벗어날 경우 그 값이 을 초래 한 경우에는 값이 단일 캐릭터 그 또는 이스케이프 시퀀스 INT 유형으로 변환되어 입력 문자와 객체. 당신이
int
또는long
처럼char
보다 큰 무언가에'\08'
을 할당 할 경우
그래서, 심지어는 유효 할 것이다. 그러나 당신이 char
에 그것을 할당했기 때문에 당신은 어떤 부분을 잘게됩니다. 어떤 부분은 또한 구현/기계에 따라 달라질 수 있습니다. 귀하의 경우에는 8
(숫자 56으로 평가되는 ASCII 문자) 값을 제공합니다. "일정한 멀티 문자 문자 경고"
모두 GCC와 연타는 이 문제에 대해 경고 않습니다.
: ": 소수점 자리 8 진수 이스케이프 시퀀스를 종료 C4125 경고",하지만 당신은/W3 기본입니다/W4 (경고 수준) 옵션을 설정해야합니다 비주얼 C++ 2010로 경고합니다. – Wacek
은 (유의 **'{}'** 버튼을 포맷하는) 질문에 코드를 넣어 주시고 의미있는 제목을 추가합니다. (질문 바로 아래에있는 버튼 편집). – BoBTFish
예, 죄송합니다! 방금이 계정을 만들었습니다 –
정의되지 않은 동작이 정의되지 않았기 때문에. [나 strlen - 때때로 1 씩 증가되는 문자열의 길이] – molbdnilo