Apa perbedaan antara | | dan || atau operator?


300

Saya selalu menggunakan ||(dua pipa) dalam ekspresi OR, baik dalam C # dan PHP. Kadang-kadang saya melihat satu pipa yang digunakan: |. Apa perbedaan antara kedua penggunaan itu? Apakah ada peringatan ketika menggunakan salah satu dari yang lain atau mereka dipertukarkan?

Jawaban:


488

Sama seperti &dan &&operator, Operator ganda adalah operator "hubungan singkat".

Sebagai contoh:

if(condition1 || condition2 || condition3)

Jika kondisi1 benar, kondisi 2 dan 3 TIDAK akan diperiksa.

if(condition1 | condition2 | condition3)

Ini akan memeriksa kondisi 2 dan 3, bahkan jika 1 sudah benar. Karena kondisi Anda bisa menjadi fungsi yang cukup mahal, Anda bisa mendapatkan peningkatan kinerja yang baik dengan menggunakannya.

Ada satu peringatan besar, Referensi Null atau masalah serupa. Sebagai contoh:

if(class != null && class.someVar < 20)

Jika kelas adalah nol, pernyataan-if akan berhenti setelah class != nullitu salah. Jika Anda hanya menggunakan &, itu akan mencoba memeriksa class.someVardan Anda mendapatkan yang bagus NullReferenceException. Dengan Operator-Or yang mungkin tidak terlalu banyak perangkap karena Anda tidak mungkin memicu sesuatu yang buruk, tetapi itu sesuatu yang perlu diingat.

Tidak ada yang pernah menggunakan tunggal &atau |operator, kecuali jika Anda memiliki desain di mana setiap kondisi adalah fungsi yang HARUS dieksekusi. Kedengarannya seperti bau desain, tapi kadang-kadang (jarang) itu cara yang bersih untuk melakukan sesuatu. The &Operator tidak "menjalankan 3 fungsi-fungsi ini, dan jika salah satu dari mereka mengembalikan false, jalankan lain blok", sementara |tidak "hanya menjalankan blok lain jika tidak ada return false" - dapat bermanfaat, tetapi sebagai kata, sering itu desain bau.

Ada penggunaan kedua dari |dan &operator: Operasi Bitwise .


9
Ya, saya tidak percaya sampai saya membuat aplikasi konsol - tapi tuan yang baik! Mengapa mereka memberi Anda tali untuk menggantung diri! Saya benci itu tentang VB.NET - kata kunci OrElse dan AndAlso!
Jarrod Dixon

24
Mengajar orang untuk menggunakan &dan |sebagai operator bersyarat adalah peretasan, dan akan membuat mereka dalam kesulitan jika mereka perlu menggunakan C / C ++: 1 && 2benar sementara 1 & 2itu salah.
BlueRaja - Danny Pflughoeft

47
Ini bukan hack, ini secara resmi ditentukan untuk C # dalam Bagian 7.10.3 Operator logis Boolean: "Hasil x | y benar jika salah x atau y benar. Jika tidak, hasilnya salah." Juga lihat Bagian 7.11 Operator logis bersyarat: "Operasi x || y sesuai dengan operasi x | y, kecuali bahwa y dievaluasi hanya jika x salah." yang selanjutnya "melegalkan" | sebagai operator bersyarat. Dan orang yang akan menggunakan C / C ++ akan tetap bermasalah jika mereka hanya secara membabi buta menganggap bahwa hal-hal bekerja sama. Seperti dikatakan: Menggunakan | dalam pernyataan if adalah aroma desain, tetapi operasi yang sangat legal.
Michael Stum

9
Saya tidak pernah mengatakan itu tidak sah, hanya saja itu adalah peretasan, yang mana itu (Anda gunakan &untuk menyampaikan makna selain apa yang hampir selalu berarti: bitwise-and) .
BlueRaja - Danny Pflughoeft

15
@ BlueRaja-DannyPflughoeft Memanggil fitur yang didokumentasikan sebagai peretasan ketika dokumentasi mengatakan bahwa peruntukan itu dimaksudkan untuk digunakan, seperti mengatakan menggunakan pergantian pernyataan "peretasan lain jika peretasan". Ini alat dalam kotak alat, alat khusus yang jarang digunakan mungkin, tetapi alat yang tidak kalah.
Gent

80

|| adalah operator OR logis. Sepertinya pada dasarnya Anda tahu apa itu. Ini digunakan dalam pernyataan bersyarat seperti jika, sementara, dll.

condition1 || condition2

Mengevaluasi ke true jika salah satu kondisi1 ATAU kondisi2 benar.

| adalah operator bitwise OR. Ini digunakan untuk beroperasi pada dua angka. Anda melihat setiap bit dari masing-masing angka secara individual dan, jika salah satu bit adalah 1 di setidaknya satu dari angka, maka bit yang dihasilkan akan menjadi 1 juga. Berikut ini beberapa contoh:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

Semoga itu masuk akal.

Jadi untuk menjawab dua pertanyaan terakhir, saya tidak akan mengatakan ada peringatan selain "tahu perbedaan antara kedua operator." Mereka tidak dapat dipertukarkan karena mereka melakukan dua hal yang sama sekali berbeda.


Ini membantu saya memahami bagaimana seseorang menggunakan bitwise ATAU operator untuk menggabungkan filter dalam driver Mongodb C #. gist.github.com/a3dho3yn/…
Donny V.

30

Salah satunya adalah "bitwise or".

10011b | 01000b => 11011b

Yang lain adalah logika atau.

benar atau salah => benar


2
|dapat digunakan pada booljenis juga tanpa hubungan arus pendek.
juharr

14

Pertanyaan bagus. Kedua operator ini bekerja sama dalam PHP dan C #.

|adalah bitwise OR. Ini akan membandingkan dua nilai dengan bit mereka. Misalnya 1101 | 0010 = 1111. Ini sangat berguna saat menggunakan opsi bit. Misalnya Baca = 01 (0X01) Tulis = 10 (0X02) Baca-Tulis = 11 (0X03). Salah satu contoh yang bermanfaat adalah membuka file. Contoh sederhana adalah:

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

||adalah OR logis. Ini adalah cara kebanyakan orang berpikir tentang ATAU dan membandingkan dua nilai berdasarkan kebenaran mereka. Misalnya saya pergi ke toko atau saya akan pergi ke mal. Ini adalah yang paling sering digunakan dalam kode. Sebagai contoh:

if(Name == "Admin" || Name == "Developer") { //allow access } //checks if name equals Admin OR Name equals Developer

Sumber Daya PHP: http://us3.php.net/language.operators.bitwise

Sumber Daya C #: http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


4
FWIW, Secara teknis, dalam C # |adalah logis atau ketika diterapkan ke boolean . Seperti yang dinyatakan oleh referensi Anda. Dalam praktiknya, hasil akhirnya sama seperti jika operator bitwise, karena nilai bitwise dari truedan falsesedemikian rupa sehingga bitwise atau nilainya menghasilkan hasil yang sama persis dengan yang logis atau tidak. Yaitu (int)(bool1 | bool2)== ((int)bool1) | ((int)bool2).
ToolmakerSteve

4

Contoh sederhana dalam java

public class Driver {

  static int x;
  static int y;

public static void main(String[] args) 
throws Exception {

System.out.println("using double pipe");
    if(setX() || setY())
        {System.out.println("x = "+x);
        System.out.println("y = "+y);
        }



System.out.println("using single pipe");
if(setX() | setY())
    {System.out.println("x = "+x);
    System.out.println("y = "+y);
    }

}

 static boolean setX(){
      x=5;
     return true;
  }
 static boolean setY(){
      y=5;
      return true;
  }
}

keluaran:

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5

2
Mengapa Anda memberikan contoh java untuk pertanyaan yang bahkan tidak menyebutkan java?
juharr

4

& - (Kondisi 1 & Kondisi 2): memeriksa kedua kasus meskipun yang pertama salah

&& - (Kondisi 1 && Kondisi 2): dosen tidak perlu repot memeriksa kasus kedua jika yang satu salah

&& - operator akan membuat kode Anda berjalan lebih cepat, secara profesional & jarang digunakan

| - (Kondisi 1 | Kondisi 2): memeriksa kedua kasus meskipun kasus 1 benar

|| - (Kondisi 1 || Kondisi 2): dosen tidak perlu repot memeriksa kasus kedua jika yang pertama benar

|| - operator akan membuat kode Anda berjalan lebih cepat, secara profesional | jarang digunakan


2
rarely used? Semua tergantung pada apa yang ingin atau perlu Anda lakukan.
Emaborsa

1
Bagus! Pendek dan manis, saya akan menghapus "| jarang digunakan" dan "& jarang digunakan" karena, seperti yang dikatakan Emaborsa, itu benar-benar tergantung pada apa yang Anda inginkan atau perlu lakukan.
Iannick

0

Pipa tunggal, |, adalah salah satu operator bitwise .

Dari Wikipedia:

Dalam keluarga bahasa pemrograman C, operator bitwise OR adalah "|" (pipa). Sekali lagi, operator ini tidak boleh bingung dengan rekan "logis atau" Boolean, yang memperlakukan operan sebagai nilai Boolean, dan dituliskan "||" (dua pipa).


0

Menurut definisi matematika mereka, OR dan AND adalah operator biner; mereka memverifikasi kondisi LHS dan RHS terlepas, mirip dengan | dan &.

|| dan && mengubah properti operator ATAU dan DAN dengan menghentikannya ketika kondisi LHS tidak terpenuhi.


-1

The | operator melakukan bitwise ATAU dari dua operan (yang berarti kedua belah pihak harus mengevaluasi false untuk mengembalikan false) sementara || operator hanya akan mengevaluasi operator kedua jika perlu.

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


Jika Anda benar-benar membaca artikel-artikel, Anda akan melihat bahwa mereka mengacu pada bitwise operator
JohnC

Bukan itu arti bitwise.
juharr

-1

Pipa menghanguskan "|" adalah "bitwise" atau dan seharusnya hanya digunakan ketika Anda tahu apa yang Anda lakukan. Pipa ganda "||" adalah logis atau, dan dapat digunakan dalam pernyataan logis, seperti "x == 0 || x == 1".

Berikut adalah contoh dari apa yang bitwise atau lakukan: jika a = 0101 dan b = 0011, maka a | b = 0111. Jika Anda berurusan dengan sistem logika yang memperlakukan non-nol sebagai benar, maka bitwise atau akan bertindak dengan cara yang sama dengan yang logis atau, tetapi itu counterpart (bitwise dan, "&") TIDAK akan. Juga bitwise atau tidak melakukan evaluasi hubung singkat.


'|' juga dapat digunakan pada booltipe tanpa hubungan arus pendek.
juharr

-2

Pipa tunggal (|) adalah operator bitwise OR .

Dua pipa (||) adalah operator OR logis.

Mereka tidak bisa dipertukarkan.


1
Jika Anda mengabaikan operasi bitwise, pipa ganda adalah evaluasi malas dan pipa tunggal serakah, dalam area operator logis.
Alex
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.