Yanıtlar:
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.someVar
ve 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 .
&
ve |
koşullu operatörler olarak kullanmayı öğretmek bir hack'tir ve C / C ++ kullanmaları gerektiğinde sorun çıkarır: yanlış 1 && 2
olsa 1 & 2
da doğrudur .
&
neredeyse her zaman ne anlama geldiğinden başka bir anlam ifade etmek için kullanıyorsunuz : bitwise- ve) .
|| 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.
İ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
|
'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ı true
ve false
bir bit ya da bir değerler mantıksal olarak aynı sonucu üreten ya da yok şekildedir. Bu (int)(bool1 | bool2)
== ((int)bool1) | ((int)bool2)
.
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
& - (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
rarely used
? Her şey ne istediğinize veya ne yapmanız gerektiğine bağlıdır.
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.
| 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
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.
bool
kısa devre olmaksızın tiplerde de kullanılabilir .
Tek bir boru (|) bitsel VEYA operatörüdür .
İki boru (||) mantıksal OR operatörüdür.
Değiştirilemezler.