std::Paradoks Penolakan Saiz Vektor: Didedahkan
Dalam program yang membingungkan, kami melihat bahawa perbandingan -1 < a.size() menilai kepada palsu, walaupun saiz std::vector
Memahami Jenis Kamiran Tidak Bertanda
Ahli saiz std::vector mengembalikan jenis kamiran yang tidak ditandatangani. Jenis kamiran tidak bertanda mewakili integer positif secara eksklusif, tidak mempunyai keupayaan untuk menyimpan nilai negatif. Apabila nilai negatif ditemui dengan jenis yang tidak ditandatangani, ia secara automatik ditukar kepada nilai positif yang besar melalui proses yang dikenali sebagai penukaran pelengkap dua.
Taip Promosi dalam Perbandingan
Dalam perbandingan -1 < a.size(), integer yang ditandatangani -1 secara tersirat dinaikkan pangkat kepada integer yang tidak ditandatangani sebelum dibandingkan dengan a.size(). Ini secara berkesan mengubah -1 menjadi nilai positif yang besar, menjadikan perbandingan itu salah.
Contoh Ilustrasi
Coretan kod berikut menunjukkan gelagat yang sama pada jenis asas:
#includeint main() { std::cout << std::boolalpha; unsigned int a = 0; int b = -1; std::cout << (b < a) << "\n"; // prints false } Dalam contoh ini, integer yang ditandatangani -1 dinaikkan pangkat kepada integer yang tidak ditandatangani sebelum dibandingkan dengan a. Oleh itu, hasilnya adalah palsu.
Kesimpulan
Ringkasnya, tingkah laku membingungkan yang diperhatikan dalam std::perbandingan vektor asal timbul daripada promosi jenis integer negatif apabila berbanding dengan jenis yang tidak ditandatangani. Integer negatif ditukar dengan berkesan kepada nilai positif yang besar, menghasilkan hasil yang tidak dijangka. Sebagai amalan terbaik, elakkan membandingkan integer yang ditandatangani dan tidak ditandatangani tanpa menghantar nilai yang ditandatangani secara eksplisit kepada jenis yang tidak ditandatangani.
Atas ialah kandungan terperinci Mengapakah `-1 < a.size()` Menilai kepada Palsu untuk `std::vector`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!