Taip Inferens dalam Ungkapan Bersyarat
Operator bersyarat (?:) ialah alat berkuasa dalam C , membenarkan kod ringkas dan ekspresif. Walau bagaimanapun, memahami jenis hasil pengendali ini boleh menjadi penting untuk penggunaan yang betul.
Pertimbangkan contoh kod berikut:
int x = 1; int y = 2; (x > y ? x : y) = 100;
Dalam kes ini, pengendali bersyarat pertama menilai kepada nilai r taip int, kerana kedua-dua operan adalah jenis int. Oleh itu, tugasan adalah sah.
Walau bagaimanapun, dalam contoh berikut:
int x = 1; long y = 2; (x > y ? x : y) = 100;
Operan bersyarat tidak boleh dinilai kepada nilai l kerana operan kedua dan ketiga adalah daripada jenis yang berbeza. Akibatnya, tugasan kepada ungkapan ini adalah tidak sah:
error: lvalue required as left operand of assignment | (x > y ? x : y) = 100; | ~~~~~~~^~~~~~~~
Untuk memahami tingkah laku ini, kita perlu menyelidiki konsep kategori nilai dalam C .
Ungkapan bersyarat mewarisi jenis dan kategori nilai daripada operannya. Jika kedua-dua operan ialah lnilai, ungkapan bersyarat juga ialah lnilai. Jika salah satu operan ialah nilai r, ungkapan bersyarat ialah nilai r.
Dalam contoh pertama, kedua-dua x dan y ialah lnilai daripada jenis yang sama, jadi ungkapan bersyarat menilai kepada nilai jenis int. Dalam contoh kedua, x ialah nilai l tetapi y ialah nilai r, jadi ungkapan bersyarat tidak boleh dinilai kepada nilai l.
Adalah penting untuk diingat bahawa kategori nilai pengendali bersyarat ditentukan pada masa penyusunan. Walaupun keadaan dinilai sebagai palsu, kategori jenis dan nilai ungkapan bersyarat mesti kekal konsisten. Ini selaras dengan peraturan bahawa sebelah kiri pengendali tugasan mestilah nilai l.
Atas ialah kandungan terperinci Bagaimanakah Inferens Jenis C Mempengaruhi Kelakuan Nilai/Rnilai Ungkapan Bersyarat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!