Apakah 0 desimal literal atau oktal literal?

329

Nol selalu nol, jadi tidak masalah. Tetapi dalam sebuah diskusi baru-baru ini dengan seorang teman dia mengatakan bahwa literal literal hampir tidak digunakan hari ini. Kemudian saya sadar bahwa sebenarnya hampir semua literal integer dalam kode saya adalah oktal, yaitu 0.

Apakah 0literal oktal menurut tata bahasa C ++? Apa yang dikatakan standar?

Satu-satunya penggunaan nyata yang saya ketahui adalah untuk izin file unix.

Yakov Galka
sumber
6
Apakah ini sama untuk Java?
Philippe
80
+1 untuk mengajukan pertanyaan yang sama sekali tidak relevan dan mendapatkan banyak upvotes :-)
Kerrek SB
64
Saya pikir cara untuk rep instan pada SO bukanlah pertanyaan yang mendalam, tetapi pertanyaan aneh yang jawabannya akan mendaratkan Anda pecandu kredit di pendingin air :)
Josh
4
Pertanyaan hebat :) Saya mencarinya di Java Language Spec , dan di Jawa itu desimal. Bahkan spec berisi kutipan berikut: Perhatikan bahwa angka oktal selalu terdiri dari dua digit atau lebih; 0 selalu dianggap sebagai angka desimal - bukan berarti angka itu penting dalam praktik, karena angka 0, 00, dan 0x0 semuanya mewakili nilai integer yang persis sama.
Tobias Ritzau
14
Saya hampir tergoda untuk mengirim jawaban yang mengatakan "Ya, 0 adalah desimal literal atau oktal literal."
Keith Thompson

Jawaban:

296

Ya, 0adalah Oktal literal dalam C ++.

Sesuai Standar C ++:

2.14.2 Literal integer [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
Alok Simpan
sumber
39
Poin penting lainnya adalah bahwa desimal-literal adalah nol digit diikuti oleh nol atau lebih digit sehingga tidak ada ambiguitas.
CB Bailey
3
@MSalters: Dengan versi Anda, Anda harus menentukan tambahan preferensi: Jika keduanya octal-literal dan decimal-literalmungkin interpretasi dari pola byte, pilih octal-literal. Kata-kata standar resmi tidak memiliki masalah ini.
Martin Sojka
23
@ MSalters: Anda masih tidak dapat memiliki desimal-literal sebagai jumlah digit, itu harus menjadi nol tunggal atau non-nol digit diikuti oleh digit apa pun jika setiap oktal literal dapat diartikan sebagai desimal literal. Aku bisa melihat kesalahan kompilasi, sekarang: ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate.
CB Bailey
3
@MSalters Dalam contoh Anda, 0123 akan cocok dengan oktal-literal dan desimal-literal, tetapi akan memiliki arti yang berbeda pula.
lembut
5
@CharlesBailey - FTFY, dengan 1masih menjadi oktal dan semua; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
twalberg
44

Nilai integer apa pun yang diawali dengan 0adalah nilai oktal. Yaitu: 01 adalah oktal 1, 010 adalah oktal 10, yang merupakan desimal 8, dan 0 adalah oktal 0 (yang desimal, dan yang lainnya, 0).

Jadi ya, '0' adalah oktal.

Itu terjemahan bahasa Inggris sederhana dari potongan tata bahasa di jawaban Als :-)


Integer diawali dengan 0xyang tidak diawali dengan 0. 0xadalah awalan yang sangat berbeda. Rupanya ada orang yang tidak dapat membuat perbedaan ini.

Sesuai standar yang sama, jika kita melanjutkan:

 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
littleadv
sumber
5
"Nilai integer yang dimulai dengan '0' adalah nilai oktal." Tidak benar. Contoh: 0xA dimulai dengan '0' dan merupakan nilai integer.
Nikolai Ruhe
4
0xbukan token. Awal integer literal 0xadalah token tunggal.
Keith Thompson
4
Sumber apa yang Anda kutip untuk definisi itu? Kata "token" didefinisikan secara sintaksis oleh standar C (N1570 6.4) dan C ++ (C ++ 11 2.7 [lex.token]). 0xtidak memenuhi syarat. (Setidaknya dalam C, ini adalah nomor preprocessing (N1570 6.4.8) jika itu bukan bagian dari konstanta heksadesimal, tapi itu bukan token.)
Keith Thompson
11
Kami sedang mendiskusikan sintaks konstanta integer / literal seperti yang didefinisikan oleh standar C dan C ++ . Bagaimana definisi standar "token" bukan yang paling tepat untuk digunakan dalam konteks ini? Sikap merendahkan Anda tidak pantas. Dan jika Anda pikir saya pengganggu karena menunjukkan sesuatu yang saya pikir merupakan kesalahan teknis dalam jawaban Anda, saya sarankan Anda harus mempertimbangkan kembali arti kata itu. (Anda tidak pernah menjawab pertanyaan saya tentang sumber definisi Anda.)
Keith Thompson
4
Jika ada yang penasaran, pernyataan bahwa " Token adalah untaian satu atau lebih karakter yang signifikan sebagai grup. " Tampaknya berasal dari artikel Wikipedia ini .
Keith Thompson
-2

Rupanya semua bilangan bulat yang dimulai dengan nol sebenarnya oktal. Ini berarti termasuk 0 juga. Ini membuat sedikit perbedaan karena nol adalah nol. Tetapi tidak mengetahui fakta ini bisa melukai Anda.

Saya menyadari hal ini ketika saya mencoba untuk menulis sebuah program untuk mengkonversi angka biner ke output desimal dan heksidecimal. Setiap kali saya memberikan angka dimulai dengan nol, saya mendapatkan output yang salah (Misalnya, 012 = 10, bukan 12).

Adalah baik untuk mengetahui informasi ini sehingga Anda tidak melakukan kesalahan yang sama.

MCG
sumber
7
Literal integer dimulai dengan nol tetapi tanpa 'x' setelah nol.
luiscubal
5
Pernyataan "ya" tanpa bukti juga bukan jawaban.
Lightness Races di Orbit
1
Dengan logika ini, 09 adalah angka oktal.
0xc0de
3
@ 0xc0de: Tidak, 09bukan angka oktal, karena ini sama sekali bukan angka; itu tidak cocok dengan sintaks untuk semua jenis literal integer.
Keith Thompson
7
Saya cukup yakin bahwa @ 0xc0de tahu bahwa 09itu bukan angka oktal. Apa yang dikatakan adalah, " Dengan logika ini , 09adalah angka oktal." Implikasinya adalah bahwa, karena 09ini bukan bilangan oktal, logika pasti salah.
TRiG