Zero jest zawsze równe zero, więc to nie ma znaczenia. Ale w niedawnej dyskusji z przyjacielem powiedział, że literalne ośmiokrotne są dziś prawie nieużywane. † Potem przyszło mi do głowy, że właściwie prawie wszystkie liczby całkowite w moim kodzie są ósemkowe, mianowicie 0
.
Czy liczba 0
ósemkowa jest zgodna z gramatyką C ++? Co mówi standard?
† Jedyne, o czym jestem świadomy, to uprawnienia do plików unixowych.
Odpowiedzi:
Tak,
0
jest literałem ósemkowym w C ++.Zgodnie ze standardem C ++:
2.14.2 Literały całkowite [lex.icon]
źródło
octal-literal
idecimal-literal
są możliwe interpretacje wzorca bajtowego, pickoctal-literal
. Brzmienie oficjalnego standardu nie ma tego problemu.ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate
.1
wciąż ósemkowy; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
Każda liczba całkowita z prefiksem
0
jest wartością ósemkową. To znaczy: 01 to liczba ósemkowa 1, 010 to liczba ósemkowa 10, która jest dziesiętna 8, a 0 to liczba ósemkowa 0 (która jest dziesiętna i dowolna inna, 0).Tak więc „0” jest ósemką.
To proste angielskie tłumaczenie fragmentu gramatyki w odpowiedzi @ Alsa :-)
Liczba całkowita z prefiksem nie
0x
jest poprzedzona prefiksem . jest wyraźnie innym przedrostkiem. Najwyraźniej są ludzie, którzy nie potrafią tego rozróżnić.0
0x
Zgodnie z tym samym standardem, jeśli będziemy kontynuować:
źródło
0x
nie jest tokenem. Literał całkowity rozpoczynający się od0x
jest pojedynczym tokenem.0x
nie kwalifikuje się. (Przynajmniej w C jest to liczba wstępnego przetwarzania (N1570 6.4.8), jeśli nie jest częścią stałej szesnastkowej, ale to nie jest token.)Najwyraźniej wszystkie literały całkowite zaczynające się od zera są w rzeczywistości ósemkowe. Oznacza to, że zawiera również 0. To niewiele robi, ponieważ zero wynosi zero. Ale nie wiedząc o tym, może cię skrzywdzić.
Zrozumiałem to, kiedy próbowałem napisać program do konwersji liczb binarnych na dane dziesiętne i szesnastkowe. Za każdym razem, gdy podawałem liczbę zaczynającą się od zera, otrzymywałem niewłaściwe dane wyjściowe (na przykład 012 = 10, a nie 12).
Dobrze jest znać te informacje, aby nie popełnić tego samego błędu.
źródło
09
nie jest liczbą ósemkową , ponieważ wcale nie jest liczbą; nie pasuje do składni żadnego rodzaju literału całkowitego.09
to nie jest liczba ósemkowa. Co zostało powiedziane było: „ Według tej logiki ,09
jest liczba ósemkowa.” Wynika z tego, że skoro09
to nie jest numer ósemkowy, logika musi być nie tak.