Saya hanya ingin tahu mengapa kita biasanya menggunakan OR logis ||
antara dua boolean bukan bitwise ATAU |
, meskipun keduanya bekerja dengan baik.
Maksud saya, lihat yang berikut ini:
if(true | true) // pass
if(true | false) // pass
if(false | true) // pass
if(false | false) // no pass
if(true || true) // pass
if(true || false) // pass
if(false || true) // pass
if(false || false) // no pass
Bisakah kita menggunakan |
bukan ||
? Hal yang sama dengan &
dan &&
.
java
bitwise-operators
Eng.Fouad
sumber
sumber
||
dan&&
hubungan arus pendek sementara|
dan&
bersemangat.&&
dan||
, tetapi tidak pernah&
|
. Jika Anda melakukan sesuatu yang tergantung pada efek samping, saya tidak melihat mengapa Anda menggunakan sesuatu seperti(a & b | c)
karena seseorang dapat dengan mudah berpikir "Saya dapat mengoptimalkan ini dengan menggunakan versi hubung singkat."Jawaban:
Jika Anda menggunakan
||
dan&&
formulir, dan bukan|
dan&
dari operator ini, Java tidak akan repot untuk mengevaluasi operan kanan saja.Masalahnya adalah apakah Anda ingin mempersingkat evaluasi atau tidak - sebagian besar waktu yang Anda inginkan.
Cara yang baik untuk menggambarkan manfaat hubungan arus pendek adalah dengan mempertimbangkan contoh berikut.
Manfaat lain, seperti yang disebutkan Jeremy dan Peter, untuk hubungan pendek adalah pemeriksaan referensi nol:
Info lebih lanjut
sumber
foo != null && foo.hasBar()
foo != null && foo.hasBar()
) atau lebih cepat (b || foo.timeConsumingCall()
). 99% pengembang tidak perlu khawatir tentang tingkat optimasi mikro ini.string == null || string.isEmpty()
;)|
tidak melakukan evaluasi hubung singkat dalam ekspresi boolean.||
akan berhenti mengevaluasi jika operan pertama benar, tetapi|
tidak akan.Selain itu,
|
dapat digunakan untuk melakukan operasi bitwise-OR pada nilai byte / pendek / int / panjang.||
tidak bisa.sumber
Jadi, hanya untuk membangun jawaban lain dengan sebuah contoh, hubungan arus pendek sangat penting dalam pemeriksaan defensif berikut:
Menggunakan
|
dan&
sebagai gantinya dapat menyebabkanNullPointerException
dilemparkan ke sini.sumber
foo
. "Contoh kanonik" Peter Lawrey adalah yang terbaik.Logis
||
dan&&
periksa sisi kanan hanya jika perlu. The|
dan&
memeriksa kedua sisi setiap kali.Sebagai contoh:
Tulis ulang:
Contoh lain:
Tulis ulang:
sumber
Perhatikan juga jebakan yang umum: Operator yang tidak malas mendahului operator yang malas, jadi:
Hati-hati saat mencampurnya.
sumber
Selain hubungan arus pendek, hal lain yang perlu diingat adalah melakukan operasi logika bitwise pada nilai yang bisa selain 0 atau 1 memiliki arti yang sangat berbeda dari logika kondisional. Meskipun BIASANYA adalah sama untuk
|
dan||
, dengan&
dan&&
Anda mendapatkan hasil yang sangat berbeda (mis.2 & 4
0 / false sedangkan2 && 4
1 / benar).Jika hal yang Anda peroleh dari suatu fungsi sebenarnya adalah kode kesalahan dan Anda sedang menguji untuk non-0-ness, ini bisa sangat berarti.
Ini bukan masalah di Jawa di mana Anda harus secara eksplisit mengetik typecast ke boolean atau membandingkan dengan 0 atau sejenisnya, tetapi dalam bahasa lain dengan sintaksis yang sama (C / C ++ et al) itu bisa sangat membingungkan.
Juga, perhatikan bahwa & dan | hanya bisa berlaku untuk nilai tipe integer, dan tidak semua yang setara dengan tes boolean. Sekali lagi, dalam bahasa non-Jawa, ada beberapa hal yang dapat digunakan sebagai boolean dengan
!= 0
perbandingan implisit (pointer, float, objek denganoperator bool()
, dll.) Dan operator bitwise hampir selalu tidak masuk akal dalam konteks tersebut.sumber
Satu-satunya waktu Anda akan menggunakan
|
atau&
bukan||
atau&&
adalah ketika Anda memiliki ekspresi boolean yang sangat sederhana dan biaya pemotongan pendek (yaitu cabang) lebih besar dari waktu yang Anda simpan dengan tidak mengevaluasi ekspresi nanti.Namun, ini adalah optimasi mikro yang jarang penting kecuali dalam kode level paling rendah.
sumber
|| adalah operator logika atau sementara | adalah bitwise atau operator.
sumber
a | b: mengevaluasi b dalam hal apa pun
a || b: mengevaluasi b hanya jika a bernilai false
sumber
Selain fakta bahwa | adalah operator bitwise: || adalah operator hubungan pendek - ketika satu elemen salah, ia tidak akan memeriksa yang lain.
jika ada sesuatu yang BENAR, || tidak akan mengevaluasi apa pun, sementara | akan melakukan. Jika variabel dalam pernyataan-if Anda sebenarnya adalah panggilan fungsi, gunakan || mungkin menghemat banyak kinerja.
sumber
sumber
Operator
||
dan&&
disebut operator kondisional , sementara|
dan&
disebut operator bitwise . Mereka melayani tujuan yang berbeda.Operator bersyarat hanya bekerja dengan ekspresi yang secara statis dievaluasi
boolean
di kedua sisi kiri dan kanan.Operator bitwise bekerja dengan operan numerik apa pun.
Jika Anda ingin melakukan perbandingan logis, Anda harus menggunakan operator kondisional , karena Anda akan menambahkan semacam jenis keamanan ke kode Anda.
sumber
|
dan&
juga operator bersyarat. Silakan lihat tautan di komentar saya ke posting asli.|
dan&
dapat digunakan sebagai operator bit-wise adalah masalah yang sepenuhnya terpisah.Catatan samping: Java memiliki | = tetapi bukan || =
Contoh kapan Anda harus menggunakan || adalah ketika ekspresi pertama adalah ujian untuk melihat apakah ekspresi kedua akan meledak. mis. Menggunakan satu | dalam hte, kasus berikut dapat menghasilkan NPE.
sumber
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:Sintaks untuk
EqualityExpression
didefinisikan dalam §15.21 , yang mengharuskanRelationalExpression
didefinisikan dalam §15.20 , yang pada gilirannya memerlukanShiftExpression
danReferenceType
didefinisikan dalam §15.19 dan §4.3 , masing-masing.ShiftExpression
membutuhkanAdditiveExpression
didefinisikan dalam §15.18 , yang terus menelusuri , mendefinisikan aritmatika dasar, operator unary, dll.ReferenceType
mengebor semua cara untuk mewakili suatu jenis. (SementaraReferenceType
tidak termasuk tipe primitif, definisi tipe primitif akhirnya diperlukan, karena mereka mungkin tipe dimensi untuk array, yang merupakan sebuahReferenceType
.)Operator Bitwise dan Logical memiliki properti berikut:
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 bertipe
boolean
atauBoolean
( §5.1.8 ).Jika operan adalah tipe integral, promosi numerik biner ( §5.6.2 ) dilakukan pada kedua operan, menjadikan keduanya sebagai
long
s atauint
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
atauBoolean
, operan akan dikenakan konversi unboxing jika perlu ( §5.1.8 ), dan jenis operasinya akanboolean
.&
akan menghasilkantrue
jika kedua operantrue
,^
akan menghasilkantrue
jika kedua operan berbeda, dan|
akan menghasilkantrue
jika salah satu operantrue
. ( §15.22.2 )Sebaliknya,
&&
adalah "Kondisional-Dan Operator" ( §15.23 ) dan||
"Kondisional-Atau Operator" ( §15.24 ). Sintaksnya didefinisikan sebagai:&&
seperti&
, kecuali hanya mengevaluasi operan kanan jika operan kiritrue
.||
seperti|
, kecuali hanya mengevaluasi operan kanan jika operan kirifalse
.Conditional-And memiliki sifat-sifat berikut:
Conditional-Atau memiliki sifat-sifat berikut:
Singkatnya, seperti @JohnMeagher telah berulang kali menunjukkan dalam komentar,
&
dan|
, pada kenyataannya, adalah operator boolean non-korsleting dalam kasus spesifik dari operan baikboolean
atauBoolean
. Dengan praktik yang baik (yaitu: tidak ada efek sekunder), ini adalah perbedaan kecil. Ketika operan tidakboolean
s atauBoolean
s, bagaimanapun, operator berperilaku sangat berbeda: operasi bitwise dan logis tidak bisa dibandingkan dengan baik pada pemrograman Java tingkat tinggi.sumber
1). (Ekspresi1 | ekspresi2), | operator akan mengevaluasi ekspresi2 terlepas dari apakah hasil ekspresi1 benar atau salah.
Contoh:
2). (Expression1 || expression2), || operator tidak akan mengevaluasi ekspresi2 jika ekspresi1 benar.
Contoh:
sumber
|| mengembalikan nilai boolean dengan OR'ing dua nilai (Itulah sebabnya dikenal sebagai LOGIS atau)
YAITU:
Akan mengembalikan true jika A atau B benar, atau salah jika keduanya salah.
| adalah operator yang melakukan operasi bitwise pada dua nilai. Untuk lebih memahami operasi bitwise, Anda dapat membaca di sini:
http://en.wikipedia.org/wiki/Bitwise_operation
sumber
Satu perbedaan utama adalah bahwa || dan && menunjukkan "hubungan arus pendek", sehingga RHS hanya akan dievaluasi jika diperlukan.
Untuk misalnya
Di atas jika a benar maka b tidak akan diuji dan path1 dieksekusi. Jika | digunakan maka kedua belah pihak akan dievaluasi bahkan jika 'a' benar.
Lihat Di Sini dan di sini , untuk informasi lebih lanjut.
Semoga ini membantu.
sumber
Non-hubungan arus pendek dapat bermanfaat. Terkadang Anda ingin memastikan bahwa dua ekspresi mengevaluasi. Misalnya, Anda memiliki metode yang menghapus objek dari dua daftar terpisah. Anda mungkin ingin melakukan sesuatu seperti ini:
Jika metode Anda sebagai gantinya menggunakan operan bersyarat, itu akan gagal untuk menghapus objek dari daftar kedua jika daftar pertama kembali palsu.
Ini tidak terlalu berguna, dan (seperti pada kebanyakan tugas pemrograman) Anda dapat mencapainya dengan cara lain. Tapi ini adalah kasus penggunaan untuk operan bitwise.
sumber
Perbedaan mendasar di antara mereka adalah bahwa | pertama-tama mengkonversi nilai-nilai ke biner kemudian melakukan sedikit bijak atau operasi. Sementara itu, || tidak mengubah data menjadi biner dan hanya melakukan atau ekspresi pada kondisi aslinya.
Baca selengkapnya: http://javarevisited.blogspot.com/2015/01/difference-between-bitwsie-and-logical.html#ixzz45PCxdQhk
sumber
Ketika saya memiliki pertanyaan ini, saya membuat kode uji untuk mendapatkan ide tentang ini.
Dalam hal ini, kami hanya mengubah nilai sisi kiri jika kondisi menambahkan a atau b.
keluaran
"If condition executed"
Keluaran-
Conclusion of ||
Saat digunakan||
, sisi kanan hanya memeriksa ketika sisi kiri salah.Keluaran-
Keluaran-
Conclusion of |
Saat digunakan|
, periksa sisi kiri dan kanan.sumber
| = bitwise atau, || = logika atau
sumber
biasanya saya gunakan ketika ada operator increment dan post increment. Lihatlah kode berikut:
keluaran:
kedua
if
blok sama tetapi hasilnya berbeda. ketika ada|
, kedua kondisi akan dievaluasi. Tetapi jika ya||
, itu tidak akan mengevaluasi kondisi kedua karena kondisi pertama sudah benar.sumber
Ada banyak kasus penggunaan yang menunjukkan mengapa Anda harus
||
memilih|
. Beberapa kasus penggunaan harus menggunakan|
operator untuk memeriksa semua kondisi.Misalnya, jika Anda ingin memeriksa validasi formulir dan Anda ingin memperlihatkan kepada pengguna semua bidang yang tidak valid dengan teks kesalahan dan bukan hanya bidang yang tidak valid pertama.
||
operator akan menjadi,Jadi dengan cuplikan di atas, jika pengguna mengirimkan formulir dengan SEMUA bidang kosong, HANYA
nameField
akan ditampilkan dengan pesan kesalahan. Tetapi, jika Anda mengubahnya menjadi,Ini akan menampilkan pesan kesalahan yang tepat pada setiap bidang terlepas dari
true
kondisi.sumber
Setelah membaca dengan seksama topik ini masih belum jelas bagi saya jika menggunakan
|
sebagai operator logis sesuai dengan praktik pola Java.Saya baru-baru ini memodifikasi kode dalam permintaan tarik mengalamatkan komentar di mana
harus diubah menjadi
Apa versi yang sebenarnya diterima?
Tidak tertarik dengan pemungutan suara, tetapi lebih pada menemukan standar ?! Kedua versi kode mengkompilasi dan berfungsi seperti yang diharapkan.
sumber
|| itu logis atau dan | sedikit bijak atau.
sumber
Operator Java
| bitwise atau, || logis atau.
sumber
Melihat:
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/operators.html
| termasuk ATAU bitwise
|| logis ATAU
sumber
| adalah operator bitwise. || adalah operator yang logis.
Satu akan mengambil dua bit dan atau mereka.
Seseorang akan menentukan kebenaran (ini ATAU itu). Jika ini benar atau itu benar, maka jawabannya benar.
Oh, dan orang-orang sialan menjawab pertanyaan-pertanyaan ini dengan cepat.
sumber