Bahaya Halus Penggunaan -1 sebagai Bendera untuk Jenis Tidak Ditandatangani
Pertimbangkan senario menggunakan -1 sebagai nilai bendera untuk fungsi yang dikembalikan jenis size_t, integer tidak bertanda. Pengawasan ini kekal tidak dapat dikesan kerana keserasian dengan pernyataan seperti x == -1 dan bukannya x < 0. Walau bagaimanapun, amalan ini mempunyai implikasi yang halus.
Pertama, penukaran -1 kepada jenis tidak bertanda menghasilkan nilai maksimum tidak bertanda, UMAX. Sebabnya terletak pada peraturan penukaran integral: untuk jenis yang tidak ditandatangani, penukaran melibatkan penambahan atau penolakan nilai maksimum yang boleh diwakili sehingga hasilnya berada dalam julat yang tidak ditandatangani.
UMAX = -1 (UMAX 1)
Pengiraan ini menghasilkan integer tidak bertanda terbesar, yang berpotensi membawa kepada tingkah laku yang tidak dijangka. Sebagai contoh, membandingkan integer yang tidak ditandatangani kepada -1 (x == -1) akan sentiasa menilai kepada palsu, walaupun jika integer adalah sifar. Begitu juga, menambah integer yang tidak ditandatangani dengan nilai bendera -1 akan menghasilkan nilai satu kurang daripada UMAX berbanding sifar.
Walaupun ptrdiff_t mungkin dicadangkan sebagai jenis bendera alternatif, ia menyusahkan dan tidak sesuai untuk kes ini. Fungsi mengembalikan indeks ke dalam tatasusunan, menjadikan size_t jenis pulangan tidak ditandatangani yang lebih sesuai.
Oleh itu, menggunakan -1 sebagai nilai bendera untuk jenis tidak ditandatangani tidak disyorkan kerana penukaran kepada UMAX dan tingkah laku tidak dijangka yang terhasil. . Adalah dinasihatkan untuk memilih nilai bendera di luar julat yang tidak ditandatangani untuk mengekalkan kejelasan dan mengelakkan potensi isu.
Atas ialah kandungan terperinci Mengapakah Menggunakan -1 sebagai Nilai Bendera untuk Jenis Tidak Ditandatangani Idea Buruk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!