Rumah >pembangunan bahagian belakang >C++ >Mengapa MSVC Tidak Memberi Amaran Mengenai Perbandingan Kesaksamaan yang Ditandatangani/Tidak Ditandatangani (==) Tetapi Memberi Amaran Mengenai Perbandingan Lain?
Perbandingan Nilai Ditandatangani dan Tidak Ditandatangani dalam MSVC: Memahami Ketiadaan Amaran
Dalam coretan kod ini, anda melihat ketiadaan amaran untuk perbandingan khusus:
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; ... if (a == b) // no warning
Ini menimbulkan persoalan mengapa perbandingan antara nilai yang ditandatangani dan tidak ditandatangani tidak mencetuskan amaran apabila dibandingkan menggunakan ==, manakala ia berlaku untuk perbandingan lain (<, >, <=, >=).
Latar Belakang Promosi dan C4018
Anda menjangkakan perbandingan ini akan menghasilkan amaran kerana promosi latar belakang. Walau bagaimanapun, dua contoh terakhir menyangkal logik ini:
if (((unsigned int)a) == b) // no warning if (a == ((int)b)) // no warning
Peraturan Penukaran
Apabila membandingkan nilai yang ditandatangani dan tidak ditandatangani, pengkompil mengikut peraturan penukaran khusus yang digariskan dalam C standard. Untuk perbandingan kesamaan (==), tidak kira sama ada operan ditandatangani atau tidak ditandatangani kerana hasilnya sentiasa boolean (benar atau salah).
Namun, untuk perbandingan lain, nilai yang ditandatangani ditukar kepada tidak ditandatangani. Penukaran ini penting kerana ia mempengaruhi hasil perbandingan. Sebagai contoh, dalam pernyataan berikut:
-1 > 2U
Hasilnya adalah benar kerana -1 ditukar kepada integer tidak bertanda positif yang besar, menghasilkan perbandingan yang betul.
Amaran MSVC Tahap
Pilihan MSVC untuk menyekat amaran bagi perbandingan kesaksamaan yang ditandatangani/tidak ditandatangani ialah sengaja. Menurut pembangun, membandingkan nilai yang ditandatangani dan tidak ditandatangani menggunakan == selalunya menghasilkan hasil yang intuitif. Sebagai contoh, -1 == -1 adalah benar tidak kira sama ada ia ditandatangani atau tidak ditandatangani.
Sebaliknya, perbandingan yang melibatkan lebih besar daripada (>) atau kurang daripada (<) pada yang ditandatangani/tidak ditandatangani kombinasi lebih berkemungkinan membawa kepada hasil yang tidak dijangka. Oleh itu, MSVC mengeluarkan amaran untuk perbandingan ini pada peringkat pengoptimuman yang lebih awal untuk membantu pembangun menangkap isu yang berpotensi.
Atas ialah kandungan terperinci Mengapa MSVC Tidak Memberi Amaran Mengenai Perbandingan Kesaksamaan yang Ditandatangani/Tidak Ditandatangani (==) Tetapi Memberi Amaran Mengenai Perbandingan Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!