Bisakah seseorang menjelaskan alasannya, mengapa dalam banyak bahasa paling populer (lihat catatan di bawah) operator perbandingan (==,! =, <,>, <=,> =) Memiliki prioritas lebih tinggi daripada operator bitwise (&, |, ^ , ~)?
Saya tidak berpikir saya pernah menemukan penggunaan di mana prioritas ini akan alami. Itu selalu seperti:
if( (x & MASK) == CORRECT ) ... // Chosen bits are in correct setting, rest unimportant
if( (x ^ x_prev) == SET ) // only, and exactly SET bit changed
if( (x & REQUIRED) < REQUIRED ) // Not all conditions satisfied
Kasing tempat saya menggunakan:
flags = ( x == 6 | 2 ); // set bit 0 when x is 6, bit 1 always.
hampir tidak ada.
Apa motivasi perancang bahasa untuk memutuskan diutamakan operator seperti itu?
Sebagai contoh, semua kecuali SQL pada 12 bahasa teratas adalah seperti itu pada daftar Bahasa Pemrograman Popularitas di langpop.com: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic.
[arithmetics] [logic operator] [arithmetics]
. Kebanyakan pemrogram tidak membuat kekacauan tanda kurung sepertiif(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
- kebanyakan akan menganggap diutamakan aritmatika daripada logika dan menulisif( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
dengan asumsi diutamakan di+
atas<
. Sekarang secara intuitifif( x ^ getMask() != PATTERN )
harus berperilaku sama, XOR menjadi operator aritmatika. Fakta itu ditafsirkan sebagaiif( x ^ ( getMask() != PATTERN ) )
sepenuhnya kontra-intuitif.Jawaban:
Bahasa telah menyalin itu dari C, dan untuk C, Dennis Ritchie menjelaskan bahwa pada awalnya, dalam B (dan mungkin awal C), hanya ada satu bentuk
&
yang tergantung pada konteksnya apakah bitwise dan atau yang logis. Kemudian, setiap fungsi mendapatkan operatornya:&
untuk bitwise dan&&
untuk yang logis. Lalu dia melanjutkansumber
c=2
Ataua==b
menghasilkan~0
dan tidak1
?Operator bitwise terkait dengan operator logis baik secara konseptual maupun tampilan, yang mungkin menjelaskan mengapa mereka saling berdekatan dalam tabel prioritas. Mungkin seseorang bahkan dapat berargumen bahwa akan membingungkan untuk
&
menjadi lebih tinggi daripada==
, tetapi&&
lebih rendah dari itu==
.Setelah preseden preseden (!) Ditetapkan, mungkin lebih baik bagi bahasa lain untuk mengikutinya demi konsistensi.
Namun, saya cenderung setuju dengan Anda bahwa ini tidak optimal. Dalam penggunaan aktual, operator bit lebih seperti operator matematika daripada operator logis, dan akan lebih baik jika mereka dikelompokkan dengan operator matematika sebagai prioritas.
sumber