Rumah > pembangunan bahagian belakang > C++ > Mengapakah `-1 < a.size()` Menilai kepada Palsu untuk `std::vector`?

Mengapakah `-1 < a.size()` Menilai kepada Palsu untuk `std::vector`?

Susan Sarandon
Lepaskan: 2024-12-10 10:03:09
asal
595 orang telah melayarinya

Why Does `-1 < a.size()` Evaluate to False for a `std::vector`?

std::Paradoks Penolakan Saiz Vektor: Didedahkan

Dalam program yang membingungkan, kami melihat bahawa perbandingan -1 < a.size() menilai kepada palsu, walaupun saiz std::vector sememangnya positif. Tingkah laku yang membingungkan ini berpunca daripada jenis data asas yang terlibat.

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:

#include 

int 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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan