| Arasındaki fark nedir ve || veya operatörler?


301

Ben her zaman ||C # ve PHP hem de OR ifadelerinde (iki boru) kullandık . Bazen ben kullanılan tek boru bkz: |. Bu iki kullanım arasındaki fark nedir? Birini diğerinin üzerinde kullanırken herhangi bir uyarı var mı veya değiştirilebilir mi?

Yanıtlar:


488

Tıpkı &ve &&operatörü gibi, çift Operatör de "kısa devre" operatörüdür.

Örneğin:

if(condition1 || condition2 || condition3)

Koşul1 doğruysa, koşul 2 ve 3 kontrol edilmez.

if(condition1 | condition2 | condition3)

Bu, 1 doğru olsa bile 2 ve 3 koşullarını kontrol edecektir. Koşullarınız oldukça pahalı işlevler olabileceğinden, bunları kullanarak iyi bir performans artışı elde edebilirsiniz.

Büyük bir uyarı, NullReferences veya benzeri sorunlar var. Örneğin:

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

Sınıf null ise, if-deyimi sonra duracaktır class != null, false olur. Sadece & kullanırsanız, kontrol etmeye çalışacak class.someVarve güzel bir şey alacaksınız NullReferenceException. Or-Operator ile bu kadar tuzak olmayabilir, çünkü kötü bir şeyi tetiklemeniz pek olası değildir, ancak akılda tutulması gereken bir şeydir.

Ancak, her koşulun yürütülmesi gereken bir işlev olduğu bir tasarıma sahip olmadığınız sürece, hiç kimse tek başına &veya |operatörleri kullanmaz . Bir tasarım kokusu gibi geliyor, ancak bazen (nadiren) bir şeyler yapmak için temiz bir yol. &Operatör "Bu 3 fonksiyonlarını çalıştırmak, ve bunlardan biri yanlış dönerse, başka bloğu yürütme" ise, yok |"hiçbiri iade sahte keşke başka bloğu çalıştırmak" yok - yararlı olabilir, ancak dediğim gibi, çoğu zaman bir dizayn koku.

Yine de |ve &operatörünün ikinci bir kullanımı vardır : Bitsel İşlemler .


9
Evet, bir konsol uygulaması oluşturana kadar inanmadım - ama iyi efendim! Neden kendini asman için ipi verdiler! Ben VB.NET nefret ettim - OrElse ve AndAlso anahtar kelimeler!
Jarrod Dixon

24
İnsanlara &ve |koşullu operatörler olarak kullanmayı öğretmek bir hack'tir ve C / C ++ kullanmaları gerektiğinde sorun çıkarır: yanlış 1 && 2olsa 1 & 2da doğrudur .
BlueRaja - Danny Pflughoeft

47
Bu bir hack değil, resmi olarak Bölüm 7.10.3 Boolean mantıksal işleçlerinde C # için belirtildi: "x | y'nin sonucu, x veya y doğruysa doğrudur. Aksi takdirde, sonuç yanlıştır." Ayrıca bkz. Bölüm 7.11 Koşullu mantıksal işleçler: "x || y işlemi, x | y işlemine karşılık gelir, ancak y, yalnızca x yanlışsa değerlendirilir." daha da "yasallaştırır" | koşullu bir operatör olarak. Ve C / C ++ 'ı kullanacak olan insanlar, her şeyin eşit şekilde çalıştığını körü körüne varsayarlarsa yine de belada olacaklar. Dediğim gibi kullanma | if ifadesinde bir tasarım kokusu vardır, ancak mükemmel bir yasal işlemdir.
Michael Stum

9
Hiçbir zaman yasal olmadığını söylemedim, sadece bir hack olduğunu, ki ( &neredeyse her zaman ne anlama geldiğinden başka bir anlam ifade etmek için kullanıyorsunuz : bitwise- ve) .
BlueRaja - Danny Pflughoeft

15
@ BlueRaja-DannyPflughoeft Belgelerin kullanılması amaçlandığını söylediği zaman belgelenmiş bir özelliği kesmek, "else else hack" anahtar deyimini kullanmak gibidir. Onun araç kutusunda bir araç, nadiren kullanılan özel bir araç belki, ama daha az olmayan bir araç.
Gent

80

|| mantıksal VEYA operatörüdür. Temelde bunun ne olduğunu biliyormuşsunuz gibi geliyor. İf, while vb. Gibi koşullu ifadelerde kullanılır.

condition1 || condition2

Koşul1 VEYA koşul2 doğruysa doğru olarak değerlendirilir.

| bitsel VEYA işleci. İki sayı üzerinde çalışmak için kullanılır. Her sayının her bitine ayrı ayrı bakarsınız ve bitlerden biri sayılardan en az birinde 1 ise, sonuçta elde edilen bit de 1 olacaktır. İşte birkaç örnek:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

Umarım bu mantıklıdır.

Bu yüzden son iki soruyu cevaplamak için, "iki operatör arasındaki farkı biliyorum" dışında herhangi bir uyarı olduğunu söylemem. Değiştirilemezler çünkü tamamen farklı iki şey yaparlar.


Bu, birisinin Mongodb C # sürücüsündeki filtreleri birleştirmek için nasıl bitsel VEYA operatörünü kullandığını anlamama yardımcı oldu. gist.github.com/a3dho3yn/…
Donny V.

30

Bunlardan biri "bitsel veya".

10011b | 01000b => 11011b

Diğeri bir mantık veya.

true veya false => true


2
|boolkısa devre yapmadan tiplerde de kullanılabilir .
juharr

14

İyi soru. Bu iki operatör PHP ve C # 'da aynı şekilde çalışır.

|bitsel VEYA. İki değeri bitlerine göre karşılaştırır. Ör 1101 | 0010 = 1111. Bu, bit seçeneklerini kullanırken son derece kullanışlıdır. Örneğin Okuma = 01 (0X01) Yazma = 10 (0X02) Okuma-Yazma = 11 (0X03). Yararlı bir örnek dosyaları açmak olabilir. Basit bir örnek:

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

||mantıklı bir OR. Bu, çoğu insanın VEYA düşünmesi ve gerçeklerine göre iki değeri karşılaştırmasıdır. Örneğin mağazaya gidiyorum ya da alışveriş merkezine gidiyorum. Kodda en sık kullanılanı budur. Örneğin:

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

PHP Kaynağı: http://us3.php.net/language.operators.bitwise

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

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


4
FWIW, Teknik olarak, C # |'da mantıksal veya booleanlara uygulandığında . Bağlantılı referans durumlarınız olarak. Bir bit-bazında operatör sanki bit tabanlı bir değerler, pratik olarak, sonuç, aynı trueve falsebir bit ya da bir değerler mantıksal olarak aynı sonucu üreten ya da yok şekildedir. Bu (int)(bool1 | bool2)== ((int)bool1) | ((int)bool2).
ToolmakerSteve

4

Java'da basit örnek

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;
  }
}

çıktı :

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

2
Java'dan bile bahsetmeyen bir soru için neden java örneği veresiniz?
juharr

4

& - (Koşul 1 ve Koşul 2): ​​birincisi yanlış olsa bile her iki durumu da kontrol eder

&& - (Koşul 1 && Durum 2): eğer vaka yanlışsa ikinci vakayı kontrol etmek için uğraşmayın

&& - operatör kodunuzun daha hızlı, profesyonelce çalışmasını sağlar ve nadiren kullanılır

| - (Koşul 1 | Koşul 2): ​​durum 1 doğru olsa bile her iki durumu da kontrol eder

|| - (Koşul 1 || Durum 2): birincisi doğruysa ikinci vakayı kontrol etmek için zahmet etmeyin

|| - operatör kodunuzun daha hızlı, profesyonelce çalışmasını sağlayacaktır | nadiren kullanılır


2
rarely used? Her şey ne istediğinize veya ne yapmanız gerektiğine bağlıdır.
Emaborsa

1
Harika! Kısa ve tatlı, "| nadiren kullanılır" ve "ve nadiren kullanılır" ı kaldırırdım, çünkü Emaborsa'nın dediği gibi, gerçekten ne yapmak istediğinize veya ne yapmanız gerektiğine bağlıdır.
Iannick

0

Tek boru, |, bitsel operatörlerden biridir.

Wikipedia'dan:

C programlama dili ailesinde bitsel VEYA operatörü "|" (boru). Yine, bu operatör, işlenenlerine Boole değerleri olarak davranan ve "||" yazılan Boole "mantıksal" veya "karşılığı" ile karıştırılmamalıdır. (iki boru).


0

Matematiksel tanımlarına göre, OR ve AND ikili operatörlerdir; benzer şekilde LHS ve RHS koşullarını doğrularlar | ve &.

|| ve && LHS koşulu karşılanmadığında OR ve AND operatörlerinin özelliklerini değiştirerek.


-1

| operatör iki işleneninin bit yönünde VEYA işlemini gerçekleştirir (yani her iki tarafın false döndürmesi için false olarak değerlendirilmesi gerekir) || operatör yalnızca gerektiğinde ikinci operatörü değerlendirir.

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

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


Bu makaleleri gerçekten okuduysanız, bitsel operatörlere atıfta bulunduklarını görürdünüz
johnc

Bitselin anlamı bu değil.
juharr

-1

Tekli boru "|" "bitsel" dir veya yalnızca ne yaptığınızı bildiğinizde kullanılmalıdır. Çift boru "||" mantıksaldır veya "x == 0 || x == 1" gibi mantıksal ifadelerde kullanılabilir.

İşte bitsel veya ne işe yarar bir örnek: a = 0101 ve b = 0011 ise, o zaman a | b = 0111. Sıfır olmayan herhangi bir değeri doğru olarak işleyen bir mantık sistemi ile uğraşıyorsanız, bitsel veya mantıksal ile aynı şekilde hareket edecek veya karşı tarafı (bitsel ve "&") DEĞİLDİR. Ayrıca bitsel veya kısa devre değerlendirmesi yapmaz.


'|' boolkısa devre olmaksızın tiplerde de kullanılabilir .
juharr

-2

Tek bir boru (|) bitsel VEYA operatörüdür .

İki boru (||) mantıksal OR operatörüdür.

Değiştirilemezler.


1
Bitsel işlemi göz ardı ederseniz, mantıksal operatör alanında çift boru tembel değerlendirme ve tek boru açgözlüdür.
Alex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.