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 0
literal oktal menurut tata bahasa C ++? Apa yang dikatakan standar?
† Satu-satunya penggunaan nyata yang saya ketahui adalah untuk izin file unix.
Jawaban:
Ya,
0
adalah Oktal literal dalam C ++.Sesuai Standar C ++:
2.14.2 Literal integer [lex.icon]
sumber
octal-literal
dandecimal-literal
mungkin interpretasi dari pola byte, pilihoctal-literal
. Kata-kata standar resmi tidak memiliki masalah ini.ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate
.1
masih menjadi oktal dan semua; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
Nilai integer apa pun yang diawali dengan
0
adalah 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
0x
yang tidak diawali dengan0
.0x
adalah awalan yang sangat berbeda. Rupanya ada orang yang tidak dapat membuat perbedaan ini.Sesuai standar yang sama, jika kita melanjutkan:
sumber
0x
bukan token. Awal integer literal0x
adalah token tunggal.0x
tidak memenuhi syarat. (Setidaknya dalam C, ini adalah nomor preprocessing (N1570 6.4.8) jika itu bukan bagian dari konstanta heksadesimal, tapi itu bukan token.)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.
sumber
09
bukan angka oktal, karena ini sama sekali bukan angka; itu tidak cocok dengan sintaks untuk semua jenis literal integer.09
itu bukan angka oktal. Apa yang dikatakan adalah, " Dengan logika ini ,09
adalah angka oktal." Implikasinya adalah bahwa, karena09
ini bukan bilangan oktal, logika pasti salah.