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 EqualityExpression
didefinisikan dalam §15.21 , yang mengharuskan RelationalExpression
didefinisikan dalam §15.20 , yang pada gilirannya memerlukan ShiftExpression
dan ReferenceType
didefinisikan dalam §15.19 dan §4.3 , masing-masing. ShiftExpression
membutuhkan AdditiveExpression
didefinisikan dalam §15.18 , yang terus menelusuri , mendefinisikan aritmatika dasar, operator unary, dll. ReferenceType
mengebor semua cara untuk mewakili suatu jenis. (Sementara ReferenceType
tidak 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 long
s atau int
s 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 boolean
atau Boolean
, operan akan dikenakan konversi unboxing jika perlu ( §5.1.8 ), dan jenis operasinya akan boolean
. &
akan menghasilkan true
jika kedua operan true
, ^
akan menghasilkan true
jika kedua operan berbeda, dan |
akan menghasilkan true
jika 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
,, b
dan 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
boolean
atau 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 false
dan 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 boolean
operan. 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
,, b
dan 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
boolean
atau 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 true
dan 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 boolean
atau Boolean
operan. 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 boolean
atau Boolean
. Dengan praktik yang baik (yaitu: tidak ada efek sekunder), ini adalah perbedaan kecil. Ketika operan tidak boolean
s atau Boolean
s, bagaimanapun, operator berperilaku sangat berbeda: operasi bitwise dan logis tidak bisa dibandingkan dengan baik pada pemrograman Java tingkat tinggi.