0은 십진 리터럴입니까 아니면 8 진 리터럴입니까?


329

0은 항상 0이므로 중요하지 않습니다. 그러나 최근 친구와의 토론에서 그는 8 진 리터럴이 오늘날 거의 사용되지 않는다고 말했습니다. 그리고 실제로 거의 저에 날이 샜다 모든 내 코드에서 정수 리터럴 입니다 즉, 진수 0.

0진법 리터럴 C ++ 문법에 따라? 표준은 무엇을 말합니까?

내가 아는 유일한 용도는 유닉스 파일 권한입니다.


6
Java와 동일합니까?
Philippe

80
:-) upvotes의 톤 전혀 관련이없는 질문을하고 얻기를위한 한
Kerrek SB를

64
나는 즉석에서 대답하는 방법은 심오한 질문이 아니라 물 냉각기에서 괴짜를 ed 게 할 특이한 질문이라고 생각합니다 :)
Josh

4
훌륭한 질문 :) Java Language Spec 에서 찾았고 Java에서는 10 진수입니다. 사양에는 다음 인용문도 포함 됩니다. 8 진수는 항상 두 자리 이상의 숫자로 구성됩니다. 0은 항상 10 진수로 간주됩니다. 실제로 0, 00 및 0x0은 모두 정확히 동일한 정수 값을 나타 내기 때문에 실제로 중요하지는 않습니다.
Tobias Ritzau

14
"예, 0은 십진 리터럴 또는 8 진 리터럴"이라는 답변을 게시하려고합니다.
Keith Thompson

답변:


296

예, C ++ 08 진 리터럴 입니다.

C ++ 표준에 따라 :

2.14.2 정수 리터럴 [lex.icon]

integer-literal:  
    decimal-literal integer-suffixopt  
    octal-literal integer-suffixopt  
    hexadecimal-literal integer-suffixopt  
decimal-literal:  
    nonzero-digit  
    decimal-literal digit  
octal-literal:  
    0                           <--------------------<Here>
    octal-literal octal-digit

39
다른 중요한 점은 10 진수 리터럴0이 아닌 숫자 다음에 0 개 이상의 숫자 이므로 모호성이 없다는 것입니다.
CB Bailey

3
@MSalters는 : 버전으로, 당신은 additionaly 기본 설정을 지정해야합니다 : 경우 모두 octal-literal 하고 decimal-literal바이트 패턴의 가능한 해석이다 선택 octal-literal. 공식 표준의 문구에는이 문제가 없습니다.
Martin Sojka

23
@MSalters : 여전히 소수점 이하 자릿수를 자릿수로 가질 수 없었 습니다. 단일 0 또는 0이 아닌 숫자 다음에 숫자 가 있어야합니다. 그렇지 않으면 모든 8 진 리터럴이 십진 리터럴로 해석 될 수 있습니다. 컴파일 오류가 발생했습니다 ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate.
CB Bailey

3
@MSalters 귀하의 예에서, 0123은 8 진 리터럴과 10 진 리터럴과 모두 일치하지만 어떤 식 으로든 다른 의미를 갖습니다.
솜털

5
@CharlesBailey - FTFY와 1여전히 진수 모든 것, P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
twalberg

44

접두사가 붙은 정수 값 0은 8 진 값입니다. 즉, 01은 8 진수 1, 010은 8 진수 10, 10 진수 8, 0은 8 진수 0 (10 진수 및 기타 0)입니다.

예, '0'은 8 진수입니다.

@Als의 답변에서 문법 스 니펫의 평범한 영어 번역입니다 :-)


접두사가 붙은 정수는 접두사 0x가 붙지 않습니다0 . 0x명시 적으로 다른 접두사입니다. 분명히이 구별을 할 수없는 사람들이 있습니다.

동일한 표준에 따라 계속하면 :

 integer-literal:
     decimal-literal integer-suffixopt
     octal-literal integer-suffixopt
     hexadecimal-literal integer-suffixopt
 decimal-literal:
     nonzero-digit                       <<<---- That's the case of no prefix.
     decimal-literal digit-separatoropt digit
 octal-literal:
     0                                    <<<---- '0' prefix defined here.
     octal-literal digit-separatoropt octal-digit <<<---- No 'x' or 'X' is
                                                          allowed here.
 hexadecimal-literal:
     0x hexadecimal-digit                 <<<---- '0x' prefix defined here
     0X hexadecimal-digit                 <<<---- And here.
     hexadecimal-literal digit-separatoropt hexadecimal-digit

5
" '0'으로 시작하는 모든 정수 값은 8 진수 값입니다." 사실이 아니다. 예 : 0xA는 '0'으로 시작하며 정수 값입니다.
Nikolai Ruhe

4
0x토큰이 아닙니다. 로 시작하는 정수 리터럴 0x은 단일 토큰입니다.
Keith Thompson

4
그 정의를 위해 어떤 출처를 인용하고 있습니까? "토큰"이라는 단어 는 C (N1570 6.4) 및 C ++ (C ++ 11 2.7 [lex.token]) 표준에 의해 구문 적 으로 정의 됩니다. 0x자격이 없습니다. (적어도 C에서는 16 진수 상수의 일부가 아니지만 토큰이 아닌 경우 전처리 번호 (N1570 6.4.8)입니다.
Keith Thompson

11
우리는 C 및 C ++ 표준에 의해 정의 된 정수 상수 / 리터럴의 구문에 대해 논의하고 있습니다 . "토큰"에 대한 표준의 정의는이 맥락에서 사용하기에 가장 적합하지 않은 방법은 무엇입니까? 모욕적 인 모욕은 부적절합니다. 그리고 당신이 당신의 대답에 기술적 오류라고 생각하는 것을 지적하는 것에 대해 괴롭힘을 당한다고 생각한다면, 그 단어의 의미를 재고해야한다고 제안합니다. (당신은 정의의 소스에 대한 내 질문에 대답 결코하지 않았다.)
키이스 톰슨

4
궁금한 점이 있다면 " 토큰은 하나 이상의 그룹으로 구성된 하나 이상의 문자로 구성된 문자열입니다. "라는 문구 는 이 Wikipedia article 에서 나온 것으로 보입니다 .
Keith Thompson

-2

분명히 0으로 시작하는 모든 정수 리터럴은 실제로 8 진입니다. 이는 0도 포함 함을 의미합니다. 0이 0이므로 차이가 거의 없습니다. 그러나이 사실을 모른다면 당신을 해칠 수 있습니다.

이진수를 십진수 및 16 진수 출력으로 변환하는 프로그램을 작성하려고 할 때 이것을 깨달았습니다. 0으로 시작하는 숫자를 줄 때마다 잘못된 출력을 얻었습니다 (예 : 12가 아닌 012 = 10).

같은 실수를하지 않도록이 정보를 아는 것이 좋습니다.


7
0으로 시작하지만 0 뒤에 'x'가없는 정수 리터럴
luiscubal

5
증거가없는 주장 "예"도 답이 아닙니다.
궤도에서 가벼움 경주

1
이 논리에 따르면 09는 8 진수입니다.
0xc0de

3
@ 0xc0de : 아니요, 098 진수가 아닙니다. 숫자가 아니기 때문입니다. 정수 리터럴의 구문과 일치하지 않습니다.
Keith Thompson

7
@ 0xc0de 그것이 098 진수가 아니라는 것을 알고 있다고 확신합니다 . " 이 논리에 따르면 098 진수입니다." 그 의미는 8 진수 09아니기 때문에 논리가 잘못되어야한다는 것입니다.
TRiG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.