Jawaban lain telah melakukan pekerjaan yang baik untuk menutupi perbedaan fungsional antara operator, tetapi jawaban itu dapat berlaku untuk hampir semua bahasa yang diturunkan dari C yang ada saat ini. Pertanyaan ditandai denganJawa, dan saya akan berusaha menjawab secara khusus dan teknis untuk bahasa Jawa.
&dan |dapat berupa Integer Bitwise Operators, atau Boolean Logical Operator. Sintaks untuk Operator Bitwise dan Logical ( §15.22 ) adalah:
AndExpression:
EqualityExpression
AndExpression & EqualityExpression
ExclusiveOrExpression:
AndExpression
ExclusiveOrExpression ^ AndExpression
InclusiveOrExpression:
ExclusiveOrExpression
InclusiveOrExpression | ExclusiveOrExpression
Sintaks untuk EqualityExpressiondidefinisikan dalam §15.21 , yang mengharuskan RelationalExpressiondidefinisikan dalam §15.20 , yang pada gilirannya memerlukan ShiftExpressiondan ReferenceTypedidefinisikan dalam §15.19 dan §4.3 , masing-masing. ShiftExpressionmembutuhkan AdditiveExpressiondidefinisikan dalam §15.18 , yang terus menelusuri , mendefinisikan aritmatika dasar, operator unary, dll. ReferenceTypemengebor semua cara untuk mewakili suatu jenis. (Sementara ReferenceTypetidak termasuk tipe primitif, definisi tipe primitif akhirnya diperlukan, karena mereka mungkin tipe dimensi untuk array, yang merupakan sebuah ReferenceType.)
Operator Bitwise dan Logical memiliki properti berikut:
- Operator ini memiliki prioritas yang berbeda, dengan
&memiliki prioritas tertinggi dan |prioritas terendah.
- Masing-masing operator ini secara sintaksis kiri-asosiatif (masing-masing kelompok kiri-ke-kanan).
- Setiap operator bersifat komutatif jika ekspresi operan tidak memiliki efek samping.
- Setiap operator bersifat asosiatif.
- Operator bitwise dan logis dapat digunakan untuk membandingkan dua operan tipe numerik atau dua operan tipe
boolean. Semua kasus lainnya menghasilkan kesalahan waktu kompilasi.
Perbedaan antara apakah operator berfungsi sebagai operator bitwise atau operator logis tergantung pada apakah operan "dapat dikonversi ke tipe integral primitif" ( §4.2 ) atau jika mereka bertipeboolean atau Boolean( §5.1.8 ).
Jika operan adalah tipe integral, promosi numerik biner ( §5.6.2 ) dilakukan pada kedua operan, menjadikan keduanya sebagai longs atau ints untuk operasi. Jenis operasi akan menjadi jenis operan (dipromosikan). Pada saat itu, &akan menjadi bitwise AND, ^akan menjadi bitwise eksklusif ATAU, dan |akan termasuk bitwise ATAU. ( §15.22.1 )
Jika operan adalah booleanatau Boolean, operan akan dikenakan konversi unboxing jika perlu ( §5.1.8 ), dan jenis operasinya akan boolean. &akan menghasilkan truejika kedua operan true, ^akan menghasilkan truejika kedua operan berbeda, dan |akan menghasilkan truejika salah satu operan true. ( §15.22.2 )
Sebaliknya, && adalah "Kondisional-Dan Operator" ( §15.23 ) dan ||"Kondisional-Atau Operator" ( §15.24 ). Sintaksnya didefinisikan sebagai:
ConditionalAndExpression:
InclusiveOrExpression
ConditionalAndExpression && InclusiveOrExpression
ConditionalOrExpression:
ConditionalAndExpression
ConditionalOrExpression || ConditionalAndExpression
&&seperti &, kecuali hanya mengevaluasi operan kanan jika operan kiri true. ||seperti |, kecuali hanya mengevaluasi operan kanan jika operan kiri false.
Conditional-And memiliki sifat-sifat berikut:
- Conditional-and operator secara sintaksis kiri-asosiatif (mengelompokkan kiri-ke-kanan).
- Operator bersyarat dan sepenuhnya asosiatif sehubungan dengan efek samping dan nilai hasil. Yaitu, untuk setiap ekspresi
a,, bdan c, evaluasi ekspresi ((a) && (b)) && (c)menghasilkan hasil yang sama, dengan efek samping yang sama terjadi dalam urutan yang sama, seperti evaluasi ekspresi (a) && ((b) && (c)).
- Setiap operand kondisional dan operator harus bertipe
booleanatau Boolean, atau kesalahan waktu kompilasi terjadi.
- Tipe dari conditional-and expression selalu
boolean.
- Pada waktu berjalan, ekspresi operan kiri dievaluasi terlebih dahulu; jika hasilnya bertipe
Boolean, maka akan dikenakan konversi unboxing ( §5.1.8 ).
- Jika nilai yang dihasilkan adalah
false, nilai ekspresi kondisional dan adalah falsedan ekspresi operan kanan tidak dievaluasi.
- Jika nilai operan tangan kiri adalah
true, maka ekspresi tangan kanan dievaluasi; jika hasilnya bertipe Boolean, maka akan dikenakan konversi unboxing ( §5.1.8 ). Nilai yang dihasilkan menjadi nilai dari kondisi-dan ekspresi.
- Jadi,
&&hitung hasil yang sama seperti &pada booleanoperan. Perbedaannya hanya pada ekspresi operan kanan dievaluasi secara kondisional daripada biasanya.
Conditional-Atau memiliki sifat-sifat berikut:
- Kondisional-atau operator secara sintaksis kiri-asosiatif (mengelompokkan kiri-ke-kanan).
- Operator bersyarat - atau sepenuhnya asosiatif sehubungan dengan efek samping dan nilai hasil. Yaitu, untuk setiap ekspresi
a,, bdan c, evaluasi ekspresi ((a) || (b)) || (c)menghasilkan hasil yang sama, dengan efek samping yang sama terjadi dalam urutan yang sama, seperti evaluasi ekspresi (a) || ((b) || (c)).
- Setiap operand dari conditional-atau operator harus bertipe
booleanatau Boolean, atau kesalahan waktu kompilasi terjadi.
- Jenis ekspresi atau kondisi selalu
boolean.
- Pada waktu berjalan, ekspresi operan kiri dievaluasi terlebih dahulu; jika hasilnya bertipe
Boolean, maka akan dikenakan konversi unboxing ( §5.1.8 ).
- Jika nilai yang dihasilkan adalah
true, nilai kondisional-atau ekspresi adalah truedan ekspresi operan kanan tidak dievaluasi.
- Jika nilai operan tangan kiri adalah
false, maka ekspresi tangan kanan dievaluasi; jika hasilnya bertipe Boolean, maka akan dikenakan konversi unboxing ( §5.1.8 ). Nilai yang dihasilkan menjadi nilai dari conditional-atau ekspresi.
- Jadi,
||hitung hasil yang sama seperti |pada booleanatau Booleanoperan. Perbedaannya hanya pada ekspresi operan kanan dievaluasi secara kondisional daripada biasanya.
Singkatnya, seperti @JohnMeagher telah berulang kali menunjukkan dalam komentar, &dan |, pada kenyataannya, adalah operator boolean non-korsleting dalam kasus spesifik dari operan baik booleanatau Boolean. Dengan praktik yang baik (yaitu: tidak ada efek sekunder), ini adalah perbedaan kecil. Ketika operan tidak booleans atau Booleans, bagaimanapun, operator berperilaku sangat berbeda: operasi bitwise dan logis tidak bisa dibandingkan dengan baik pada pemrograman Java tingkat tinggi.