Pertama, beberapa latar belakang: Saya seorang guru IT dalam pelatihan dan saya mencoba memperkenalkan operator boolean java ke kelas 10 saya. Guru-mentor saya memeriksa lembar kerja yang saya siapkan dan berkomentar bahwa saya bisa membiarkan mereka menggunakan hanya satu & atau | untuk menunjukkan operator, karena mereka "melakukan hal yang sama".
Saya menyadari perbedaan antara & dan &&.
& adalah operator bitwise yang dimaksudkan untuk digunakan di antara bilangan bulat, untuk melakukan "bit-twiddling".
&& adalah operator kondisional yang dimaksudkan untuk digunakan di antara nilai-nilai boolean.
Untuk membuktikan bahwa operator ini tidak selalu "melakukan hal yang sama", saya mencari contoh di mana menggunakan bitwise antara nilai boolean akan menyebabkan kesalahan. Saya menemukan contoh ini
boolean bitwise;
boolean conditional;
int i=10, j=12;
bitwise = (i<j) | ((i=3) > 5); // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10;
conditional = (i<j) || (i=3) > 5 ; // value of i after oper: 10
System.out.println(conditional+ " "+ i);
i=10;
bitwise = (i>j) & (i=3) > 5; // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10;
conditional = (i>j) && (i=3) > 5; // value of i after oper: 10
System.out.println(conditional+ " "+ i);
Contoh ini menunjukkan bahwa jika suatu nilai harus diubah oleh bagian kedua dari ekspresi, ini akan menyebabkan perbedaan antara hasil, karena bitwise adalah operator yang bersemangat, sedangkan kondisional berperilaku sebagai hubungan pendek (tidak mengevaluasi yang kedua setengah, jika setengah pertama salah dalam kasus && dan benar dalam kasus ||).
Saya punya masalah dengan contoh ini. Mengapa Anda ingin mengubah nilai pada saat yang sama dengan melakukan perbandingan? Sepertinya bukan cara yang kuat untuk kode. Saya selalu enggan melakukan beberapa operasi dalam satu baris dalam kode produksi saya. Sepertinya sesuatu yang "koboi pengkodean" tanpa hati nurani akan pemeliharaan kode-nya. Saya tahu bahwa dalam beberapa kode domain harus sepadat mungkin, tetapi tentunya ini adalah praktik yang buruk pada umumnya?
Saya dapat menjelaskan pilihan saya untuk mendorong penggunaan && dan || lebih & dan | karena ini adalah konvensi pengkodean yang diterima dalam rekayasa perangkat lunak .
Tetapi bisakah seseorang tolong beri saya contoh yang lebih baik, bahkan di dunia nyata, menggunakan operator bitwise dalam ekspresi bersyarat?
sumber
bitwise = !(true & true == false);
dancondition = !(true && true == false);
akan sama-sama mengevaluasi menjadi benar, jadi dalam hal ini keduanya dapat dipertukarkan? Mungkin secara sintaksis, karena kode masih dikompilasi. Saya setuju bahwa mereka digunakan untuk hal-hal yang berbeda secara semantik, seperti yang saya sebutkan pada paragraf 2. Anda mengatakan itu! dan & "hampir tidak pernah muncul dalam kondisi sendiri". Saya mencari kasus-kasus "hampir tidak pernah" ini, dan bertanya-tanya apakah mereka benar-benar ada.Operator non-bitwise
&&
dan||
merupakan operator hubung singkat. Dengan kata lain, dengan&&
, jika LHS salah, RHS tidak akan pernah dievaluasi; dengan||
jika LHS benar, maka RHS tidak akan pernah dievaluasi. Di sisi lain, operator bitwise&
dan|
non-korsleting, dan akan selalu mengevaluasi LHS dan RHS. Kalau tidak, mereka setara dalam sebuahif
pernyataan.Satu-satunya waktu saya dapat melihat nilai dalam menggunakan operator non-hubung singkat adalah jika RHS memiliki semacam efek samping yang diinginkan yang Anda inginkan terjadi dalam semua kasus. Saya tidak dapat memikirkan contoh spesifik di mana Anda menginginkan ini, dan saya tidak percaya itu adalah praktik yang baik, tetapi itulah bedanya.
sumber
Jawaban filosofis umum adalah bahwa menggunakan operator bitwise untuk operator boolean tidak lazim dan membuat kode lebih sulit dibaca. Dalam prakteknya (untuk kode yang ada dalam produksi), kode yang lebih mudah dibaca lebih mudah dipelihara dan dengan demikian lebih diinginkan.
Untuk penggunaan di dunia nyata dari kebutuhan akan operator hubungan pendek, lihat kasus-kasus seperti:
Jenis operasi ini sering muncul dalam kode dunia nyata.
sumber
&
“lebih sulit dibaca” daripada 2? Saya tidak punya contoh di mana 2 operator tidak bekerja dengan cara yang sama untuk operan Boolean. Saya menyetujui poin Anda tentang kode yang lebih mudah dibaca dan lebih mudah dikelola. Saya ingin mendorong mereka untuk menulis kode yang indah. Tetapi memiliki beberapa bukti di tas alat saya akan lebih meyakinkan daripada "karena saya bilang begitu". Saya sudah menyatakannya sebagai standar pada tautan itu, dan mungkin harus mengandalkan itu sendiri jika saya tidak mendapatkan contoh yang saya cari. Seperti yang saya tanyakan pada @Steve Haigh: haruskah java menunjukkan ini sebagai penggunaan yang tidak tepat?Anda akan menggunakan operator bitwise jika Anda membandingkan enumerasi Bitmask. Misalnya, Anda memiliki penghitungan status dan objek yang bisa berada di lebih dari satu status tersebut. Dalam hal ini, Anda akan melakukan bitwise atau untuk menetapkan lebih dari satu status ke objek Anda.
misalnya
state = CONNECTED | IN_PROGRESS
dimanaCONNECTED could be 0x00000001
danIN_PROGRESS 0x00000010
Untuk info lebih lanjut, lihat dokumentasi flag enums.
sumber
contoh sederhana kesalahan:
di sini Anda memiliki dua kondisi, keduanya bukan nol; tetapi
&
hasil bitwise dalam nol.sumber
(condA && condB)
kesalahan, karena && tidak berfungsi selama 2int
detik, hanya 2 boolean.(condA & condB)
sementara benar, mengevaluasi keint
dan di java kita tidak bisa mengatakannyaif(int)
juga kesalahan. Anda adalah orang pertama yang memahami apa yang saya cari - persis contoh kesalahan itu .(Boolean(condA) && Boolean(condB))
(saya pikirBoolean(x)
initrue
untuk bilangan bulat bukan nol, kan?)((condA!=0) && (condB!=0))
?if (((condA!=0) && (condB!=0))) { System.out.println("correct"); } if (((condA!=0) & (condB!=0))) { System.out.println("never executed?"); }
mengeksekusi kedua pernyataan cetak.