Rumah >pembangunan bahagian belakang >C++ >Mengapa MSVC Memberi Amaran Mengenai Perbandingan yang Ditandatangani/Tidak Ditandatangani dalam Beberapa Kes Tetapi Bukan Yang Lain?
Pertimbangkan coretan kod berikut:
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; if (a < b) // warning C4018: '<' : signed/unsigned mismatch c = true; ... // Additional comparisons if (a == b) // no warning c = true; ... // Additional comparisons
Memahami Ketidakpadanan yang Ditandatangani/Tidak Ditandatangani 🎜>
Dalam C , integer yang ditandatangani dan tidak ditandatangani mempunyai jenis yang berbeza, dan apabila membandingkannya secara langsung (cth., menggunakan <, >), MSVC mengeluarkan amaran (C4018). Ini kerana pengkompil cuba mempromosikan kedua-dua operan kepada jenis biasa sebelum melakukan perbandingan.Peraturan Promosi
Untuk perbandingan integer, MSVC mengikut "aritmetik biasa penukaran" peraturan seperti yang ditakrifkan dalam piawaian C. Peraturan ini menentukan promosi yang berlaku sebelum perbandingan:Mengapa Tiada Amaran untuk == b?
Dalam contoh, apabila membandingkan a dan b menggunakan ==, MSVC tidak mengeluarkan amaran kerana kedua-dua operan ditukar kepada int tidak ditandatangani sebelum perbandingan. Memandangkan nilai a dan b adalah kedua-duanya positif, tiada ketidakpadanan yang ditandatangani/tidak ditandatangani dan hasilnya adalah betul.Keputusan Intuitif dan Bukan Intuitif
Sementara kekurangan amaran untuk == b mungkin kelihatan intuitif, perkara yang sama tidak boleh dikatakan untuk perbandingan seperti < b. Dalam kes ini, penukaran a kepada tidak ditandatangani menghasilkan nilai yang lebih besar, yang mempengaruhi hasil perbandingan. Oleh itu, MSVC mengeluarkan amaran untuk menyerlahkan potensi isu dengan perbandingan yang ditandatangani/tidak ditandatangani.Kesimpulan
MSVC tidak mengeluarkan amaran untuk a == b kerana aritmetik biasa penukaran menyebabkan kedua-dua operan ditukar kepada jenis yang tidak ditandatangani yang sama, menghapuskan sebarang ketidakpadanan yang ditandatangani/tidak ditandatangani. Walau bagaimanapun, untuk perbandingan menggunakan operator seperti < atau >, potensi hasil yang tidak dijangka disebabkan oleh penukaran memerlukan amaran daripada pengkompil.Atas ialah kandungan terperinci Mengapa MSVC Memberi Amaran Mengenai Perbandingan yang Ditandatangani/Tidak Ditandatangani dalam Beberapa Kes Tetapi Bukan Yang Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!