Rumah >pembangunan bahagian belakang >C++ >Mengapa MSVC Memberi Amaran Mengenai Perbandingan yang Ditandatangani/Tidak Ditandatangani dalam Beberapa Kes Tetapi Bukan Yang Lain?

Mengapa MSVC Memberi Amaran Mengenai Perbandingan yang Ditandatangani/Tidak Ditandatangani dalam Beberapa Kes Tetapi Bukan Yang Lain?

DDD
DDDasal
2024-12-26 01:27:11627semak imbas

Why Does MSVC Warn About Signed/Unsigned Comparisons in Some Cases But Not Others?

Perbandingan Integer Ditandatangani dan Tidak Ditandatangani dalam MSVC

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:

    Promosi bersepadu (cth., int to long int)
  • Penukaran kepada jenis operan yang tidak ditandatangani jika ia lebih besar daripada yang ditandatangani operan
  • Penukaran kepada int panjang yang tidak ditandatangani jika kedua-dua operan adalah integer

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn