Menjelaskan Anomali Berangka dalam C : Kepentingan Sifar Utama
Dalam bidang pengaturcaraan C, kelakuan literal integer yang mengandungi sifar pendahuluan boleh membingungkan kadang-kadang. Mari kita selidiki perkara yang ingin tahu ini dan terangkan mekanik asasnya.
Piawaian C mentakrifkan literal integer sebagai jujukan digit tanpa titik perpuluhan atau eksponen. Membubuhkan awalan literal dengan 0 menandakan nombor perlapanan (asas-8), manakala ketiadaan awalan menunjukkan nombor perpuluhan (asas-10).
Walau bagaimanapun, pertimbangkan coretan kod berikut:
int i = 07; // i == 7 int i = 16; // i == 16 int i = 00016; // i == 14, why? int i = 05016; // i == 2574, wow )
Dalam contoh pertama, i ditetapkan kepada nilai 7 kerana 07 ditafsirkan sebagai nilai perlapanan (8 * 0 7 = 7). Ini selaras dengan konvensyen C untuk mentafsir sifar pendahuluan tanpa awalan sebagai nombor perlapanan.
Walau bagaimanapun, dalam contoh seterusnya, sifar pendahuluan muncul sebelum digit perpuluhan, yang menimbulkan persoalan. Mengikut piawaian, literal ini tidak boleh diterima sebagai nombor perlapanan. Jadi, apa yang berlaku di sini?
Jawapannya terletak pada pengoptimuman pengkompil yang dikenali sebagai "penindasan oktal". Apabila pengkompil menemui sifar pendahuluan diikuti dengan digit perpuluhan, ia menindas tafsiran oktal dan menganggap literal sebagai perpuluhan. Ini menjelaskan mengapa 00016 dinilai sebagai 14 dan 05016 sebagai 2574.
Sebaliknya, 08 mencetuskan ralat penyusunan kerana ia melanggar peraturan standard bahawa literal perlapanan tidak boleh mengandungi digit 8 atau 9. Pengkompil menjangkakan nombor perlapanan yang sah, tetapi ia mendapati aksara yang tidak sah dan menimbulkan satu ralat.
Atas ialah kandungan terperinci Mengapakah Sifar Utama dalam Huruf Integer C Kadangkala Menghasilkan Keputusan yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!