Rumah >pembangunan bahagian belakang >C++ >Mengapa MSVC Tidak Memberi Amaran Mengenai Perbandingan Kesaksamaan yang Ditandatangani/Tidak Ditandatangani (==) Tetapi Memberi Amaran Mengenai Perbandingan Lain?

Mengapa MSVC Tidak Memberi Amaran Mengenai Perbandingan Kesaksamaan yang Ditandatangani/Tidak Ditandatangani (==) Tetapi Memberi Amaran Mengenai Perbandingan Lain?

Patricia Arquette
Patricia Arquetteasal
2024-12-21 00:14:16752semak imbas

Why Doesn't MSVC Warn About Signed/Unsigned Equality Comparisons (==) But Warns About Other Comparisons?

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!

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