Neden genellikle || bitti |? Fark ne?


219

Neden her ikisi de iyi çalışıyor olsa da, genellikle ||iki mantıksal veya iki boolean arasında mantıksal OR kullandığımızı merak ediyorum |.

Yani, aşağıdakilere bakın:

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

|Bunun yerine kullanabilir miyiz ||? İle aynı şey &ve &&.


16
Çoğu insan bunu unutuyor | bitsel bir operatör olmasının yanı sıra kısa devre yapmayan bir boolean operatörüdür.
John Meagher

1
Farkla ilgili ayrıntılar JLS'de. Bkz. Java.sun.com/docs/books/jls/third_edition/html/…
John Meagher

64
Aynı değiller. Lütfen özellikle kısa devre değerlendirmesi ve istekli değerlendirme ile ilgili öğreticilere göz atın . ||ve &&kısa devre varken |ve &istekli.
Hovercraft Eels ile Dolu

4
Sadece meraktan, hangi durumda kısa devre olmayan sürümleri kullanmak istersiniz? Neredeyse her zaman görüyorum &&ve ||ama asla & |. Yan etkilere bağlı bir şey yapıyorsanız, neden (a & b | c)birisini kolayca "Kısa devre sürümlerini kullanarak optimize edebilirim" diye düşünebileceğinden neden böyle bir şey kullanacağınızı anlamıyorum .
Mike Bailey

2
Ve elbette, farklı öncelikleri var.
Hot Licks

Yanıtlar:


349

Bu işleçlerin ve formları yerine ||ve &&formlarını kullanırsanız , Java yalnızca sağ taraftaki işleneni değerlendirmek için uğraşmaz.|&

Bu, değerlendirmeyi kısa devre yapmak isteyip istemediğinizle ilgilidir - çoğu zaman istediğiniz.

Kısa devre yapmanın yararlarını göstermenin iyi bir yolu, aşağıdaki örneği dikkate almak olacaktır.

Boolean b = true;
if(b || foo.timeConsumingCall())
{
   //we entered without calling timeConsumingCall()
}

Jeremy ve Peter'ın belirttiği gibi bir diğer fayda da kısa devre için boş referans kontrolüdür:

if(string != null && string.isEmpty())
{
    //we check for string being null before calling isEmpty()
}

Daha fazla bilgi


115
Kanonik örnekfoo != null && foo.hasBar()
Jeremy

1
| Kullanarak olası boş null başvuru istisnası eklerseniz @ Jeremy'nin yorumundan o zaman bu harika bir cevap.
Peter Kelly

Ayrıca hatırlayın && ve || makine kodu düzeyinde bir dal talimatı anlamına gelir (dalların dal yanlış tahminlerine neden olabileceğini unutmayın), bu nedenle performansla ilgili süper bilgili iseniz, bunları yalnızca gerçekten gerekli ( foo != null && foo.hasBar()) veya daha hızlı ( b || foo.timeConsumingCall()) olduğunda kullanın. Yine de geliştiricilerin% 99'u bu mikro-optimizasyon seviyesi hakkında endişelenmemelidir.
Jonathan Dickinson

3
Kullanmak istediğinizde kimsenin bahsetmediğine şaşırdım. Bunu kullandığım en yaygın senaryo, bir değişkenin (j> 3 | ++ i> 3) veya (++ i> 3 | modifiyeGlobalAmongOtherThings () = true) gibi bir değişime uğramasıdır. Yine de çok yaygın değil.
AndSoYouCode

8
Başka bir kanonik örnek string == null || string.isEmpty();)
Peter Lawrey

83

| boole ifadelerinde kısa devre değerlendirmesi yapmaz . ||ilk işlenenin doğru olup olmadığını değerlendirmeyi durduracak, ancak |olmayacak.

Ek olarak, |bayt / kısa / int / uzun değerlerde bit-OR işlemini gerçekleştirmek için kullanılabilir. ||olumsuz.


Tam bir cevap ver, ben de kabul edeceğim. Şimdiye kadar bu yönünü ilk öğrenen sizsiniz.
John Meagher


63

Bu nedenle, sadece bir örnekle diğer cevaplara dayanmak için, aşağıdaki savunma kontrollerinde kısa devre yapmak çok önemlidir:

if (foo == null || foo.isClosed()) {
    return;
}

if (bar != null && bar.isBlue()) {
    foo.doSomething();
}

Kullanılması |ve &bir neden olabilir yerine NullPointerExceptionburada atılan.


NullObject desenini uyguladıysanız, yanıt vermez (ya da daha doğrusu cevabı reddeder). Ayrıca, foo'nun mavi olup olmadığını kontrol etmenin foo'nun içinde bir şey olduğunu söyleyebilirim. Eğer mavi ise, o zaman doSomething hiçbir şey yapmamalıdır.
nicodemus13

@ nicodemus13 - Null Nesne kalıbı sadece bazen istenebilir ve beden başka bir çağrıdan başka bir şey olabilir foo. Peter Lawrey'in "kanonik örneği" en iyisidir.
Paul Bellora

@Khan: Evet, oldukça titiz davranıyordum ve Null Object her zaman uygun değil. Sadece bilinçaltında bir şeyleri yeniden düzenleme alışkanlığına girmiştim. Cevabınızla ilgili özellikle yanlış bir şey yok.
nicodemus13

39

Mantıksal ||ve &&sağ tarafı yalnızca gerekirse kontrol edin. |Ve &iki tarafın her şey hem kontrol edin.

Örneğin:

int i = 12;
if (i == 10 & i < 9) // It will check if i == 10 and if i < 9
...

Yeniden yaz:

int i = 12;
if (i == 10 && i < 9) // It will check if i == 10 and stop checking afterward because i != 10
...

Başka bir örnek:

int i = 12;
if (i == 12 | i > 10) // It will check if i == 12 and it will check if i > 10
...

Yeniden yaz:

int i = 12;
if (i == 12 || i > 10) // It will check if i == 12, it does, so it stops checking and executes what is in the if statement
...

18

Ayrıca ortak bir tuzağa dikkat edin: Tembel olmayan operatörler tembel olanlara göre önceliklidir, bu yüzden:

boolean a, b, c;
a || b && c; //resolves to a || (b && c)
a | b && c; //resolves to (a | b) && c

Karıştırırken dikkatli olun.


15

Kısa devreye ek olarak, akılda tutulması gereken bir başka şey, 0 veya 1'den başka değerler üzerinde bitsel bir mantık işlemi yapmanın koşullu mantıktan çok farklı bir anlama sahip olmasıdır. USUALLY |ve için aynı olsa da ||, &ve &&çok farklı sonuçlar alırsınız (örneğin 2 & 40 / false iken 2 && 41 / true).

Bir işlevden aldığınız şey aslında bir hata koduysa ve 0 olmayanlık için test yapıyorsanız, bu çok önemli olabilir.

Bu, Java'da açıkça boole yazmanız veya 0 veya benzeri ile karşılaştırmanız gereken bir sorun değildir, ancak benzer sözdizimine (C / C ++ ve diğerleri) sahip diğer dillerde oldukça kafa karıştırıcı olabilir.

Ayrıca, & ve | yalnızca tamsayı türü değerlere uygulanabilir ve boole testine eşdeğer olabilecek her şey için geçerli değildir. Yine, Java dışı dillerde, örtük bir != 0karşılaştırmayla (işaretçiler, şamandıralar, nesneler operator bool()vb.) Bir boole olarak kullanılabilecek birkaç şey vardır ve bitsel operatörler bu bağlamlarda neredeyse her zaman saçmadır.


3
En azından birisinin bitsel operatörlerin varlığının tüm amacından bahsetmesinden memnunum .
ulidtko

9

Kullanırsınız sadece zaman |ya &yerine ||ya &&çok basit boole ifadeleri ve kısa kesim (yani bir kolu) maliyetini olduğunda ise daha sonraki ifadeleri değerlendirerek değil kurtarışı zaman sen daha büyüktür.

Bununla birlikte, bu, en düşük seviye kodu dışında nadiren önemli olan bir mikro optimizasyondur.


1
Derleyicinin bunu bazı durumlarda otomatik olarak yapıp yapmaması ilginçtir.
starblue

Belki de JIT yapabilir, ancak derleyici sadece basit optimizasyonlarla uğraşma eğilimindedir.
Peter Lawrey

2
Evet, ben de gördüm durumlar | , özellikle şube tahmini olmayan veya sınırlı olan CPU'larda şube yükünden || çok daha hızlıdır. Nadir ama duyulmamış. İş arkadaşlarımdan biri (doğru) kullanarak bir müteahhit ile bazı kodda bir geri savaşa girdi | ve müteahhit bunun "yanlış" olduğunu düşünmeye devam etti.
kabarık

4
@Fluffy, hikayenin ahlaki, zor bir şey yaparsanız, bunu neden yaptığınıza veya çabalarınızın daha sonra boşa harcanabileceğine dair yorum yapılması gerektiğidir. ;)
Peter Lawrey

1
Evet, sonunda bir yorum ekledi (yüklenicinin 'düzeltmeyi' durdurmasını nasıl sağlayacağım konusunda benim önerim) ve her şey yolunda.
kabarık

8

|| mantıksal veya operatör ise | bitsel veya operatördür.

boolean a = true;
boolean b = false;

if (a || b) {
}

int a = 0x0001;
a = a | 0x0002;

1
Eksik | aynı zamanda kısa devre yapmayan bir boolean operatörüdür.
John Meagher

2
@John Meagher: Bu kapalı, çünkü bitsel .
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

@ L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ profilinizde adınızı nasıl farklı bir tarz haline getirdiniz?
UdayKiran Pulipati

8

a | b: her durumda b'yi değerlendirin

a || b: yalnızca yanlış olarak değerlendirilmişse b'yi değerlendirin


7

Buna ek olarak gerçeği | bitsel bir operatördür: || bir kısa devre operatörüdür - bir eleman yanlış olduğunda diğerlerini kontrol etmez.

 if(something || someotherthing)
 if(something | someotherthing)

bir şey DOĞRU ise, || bir şeyi değerlendirmezken, | yapacağım. İf-ifadelerinizdeki değişkenler aslında işlev çağrılarıysa, || muhtemelen çok fazla performans tasarrufu sağlıyor.


Neden hiç kullanıyorsun | if ifadesinde. || boolean, | değil, | yalnızca iki boolean değeri üzerinde çalışıyorsanız boolean olur.
FlySwat

Her şeyi elde etmek için ilk cevap budur.
John Meagher

Bu cevap yanlış. Bir şey YANLIŞ ise, her iki işleç de sonraki işlenene gider. Fark sadece ilk işlenen doğru olduğunda ortaya çıkar.
Michael Myers

Kötü için kesinlikle saçma bir örnek var.
FlySwat

Neden kimse kullanacağı hakkında hiçbir fikrim yok | ya da basit boolean karşılaştırması için bir if-ifadesinde, ama tamamen yasaldır ve aslında programlamayı öğrenmeye başladığımda bunun örneklerini gördüm.
Michael Stum

3
| is the binary or operator

|| is the logic or operator

2
Eksik | aynı zamanda kısa devre yapmayan bir boolean operatörüdür.
John Meagher

3

Operatörler ||ve &&denir koşullu operatörleri , süre |ve &denir operatörler bit düzeyinde . Farklı amaçlara hizmet ederler.

Koşullu işleçler yalnızca booleanhem sol hem de sağ tarafta istatistiksel olarak değerlendirilen ifadelerle çalışır .

Bitsel işleçler, sayısal işlenenlerle çalışır.

Mantıksal bir karşılaştırma yapmak istiyorsanız , kodunuza bir tür güvenlik ekleyeceğiniz için koşullu işleçler kullanmalısınız .


Um |ve &ayrıca koşullu operatörlerdir. Lütfen yorumumdaki orijinal gönderinin bağlantısına bakın.
Hovercraft Eels Dolu

@Hovercraft Eels Dolu: Bu grafik biraz yanıltıcı; bunlara SADECE boolean değerleri bağlamında koşullu işleçler olarak atıfta bulunur, burada matematiksel olarak istekli mantıksal işleçlere eşdeğerdirler. 0 veya 1 dışında değerler veya kayan nokta değerleri veya işaretçiler veya başka bir şeyle uğraşmaya başladığınızda karşılaştırma bozulur.
kabarık

@fluffy: Tartışma sadece boole operatörleri hakkında olduğundan, grafik hakkında yanıltıcı bir şey yok. O |ve &bit temelinde operatörler olarak kullanılabilir tamamen ayrı bir konudur.
Hovercraft Eels ile dolu

1
Bunlara, boole değerlerinde kullanılan, boole değerlerinde kullanılan bit-bilge işleçleri olarak başvurmak daha doğru olur. Sadece tek bir bit olduğunda matematiksel olarak eşdeğer olmak zorundalar.
kabarık

2

Yan not: Java'da | = var ancak || = değil

Ne zaman kullanmanız gerektiğine bir örnek || ilk ifadenin, ikinci ifadenin patlayıp patlamayacağını görmek için bir test olduğu zamandır. örn. Tekli kullanma | aşağıdaki durumda bir NPE ile sonuçlanabilir.

public static boolean isNotSet(String text) {
   return text == null || text.length() == 0;
}

2

Diğer cevaplar, operatörler arasındaki fonksiyonel farkı örtmek için iyi bir iş çıkardı, ancak cevaplar bugün var olan hemen hemen her C türevi dile uygulanabilir. Soru ile etiketlendiJava dili için özel ve teknik olarak cevap vermeye çalışacağım.

&ve |Tamsayı Bitsel İşleçleri veya Boolean Mantıksal İşleçleri olabilir. Bitsel ve Mantıksal İşleçlerin sözdizimi ( §15.22 ):

AndExpression:
  EqualityExpression 
  AndExpression & EqualityExpression

ExclusiveOrExpression:
  AndExpression 
  ExclusiveOrExpression ^ AndExpression

InclusiveOrExpression:
  ExclusiveOrExpression 
  InclusiveOrExpression | ExclusiveOrExpression

Sözdizimi EqualityExpressiontanımlanır §15.21 gerektirir, RelationalExpressiontanımlanan §15.20 da gerektirir, ShiftExpressionve ReferenceTypede tanımlandığı §15.19 ve §4.3 sırasıyla. ShiftExpressiongerektirir AdditiveExpressiontanımlanan §15.18 temel vb aritmetik, tekli operatörler, tanımlama, detaya devam ettiği, ReferenceTypebir tür temsil etmek tüm çeşitli şekillerde olan matkaplar aşağı. (İken ReferenceTypeilkel türde içermez bunlar bir dizi için, boyut tipi olabilecek, ilkel türde tanımı sonuçta gereklidir olan bir ReferenceType.)

Bitsel ve Mantıksal İşleçler aşağıdaki özelliklere sahiptir:

  • Bu operatörler &, en yüksek önceliğe ve |en düşük önceliğe sahip farklı önceliğe sahiptir .
  • Bu operatörlerin her biri sözdizimsel olarak sol ilişkilidir (her grup soldan sağa).
  • İşlenen ifadelerin hiçbir yan etkisi yoksa her operatör değişebilir.
  • Her operatör ilişkiseldir.
  • Bitsel ve mantıksal işleçler, iki türden iki işlenen veya iki türden işlenen karşılaştırmak için kullanılabilir boolean. Diğer tüm durumlar derleme zamanı hatasına neden olur.

Operatörün bitsel operatör veya mantıksal operatör olarak hizmet vermesi arasındaki fark, işlenenlerin "ilkel integral tipine dönüştürülebilir" ( §4.2 ) veya tip booleanveya Boolean( §5.1.8 ) tiplerine bağlı olmasına bağlıdır .

İşlenenler tümleşik türdeyse , her iki işlenende ikili sayısal tanıtım ( §5.6.2 ) yapılır ve bu işlem için longs veya ints olarak kalır . İşlemin türü (terfi) işlenenlerin türü olacaktır. Bu noktada, &bitsel VE ^olacak, bitsel özel VEYA ve |bitsel kapsayıcı VEYA olacaktır. ( §15.22.1 )

İşlenen ise booleanya da Boolean, işlenen gerekirse (eğer kutudan çıkarma dönüşüm tabi olacaktır §5.1.8 ) ve çalışma tipi olacaktır boolean. &sonuçlanacaktır trueher iki işlenen ise true, ^sonuçlanacaktır trueiki işlenen farklıysa, ve |neden olacaktır trueya işlenen ise true. ( §15.22.2 )

Buna karşılık, && "Koşullu ve İşletmen" ( §15.23 ) ve ||"Koşullu veya İşletmen" dir ( §15.24 ). Sözdizimleri şöyle tanımlanır:

ConditionalAndExpression:
  InclusiveOrExpression 
  ConditionalAndExpression && InclusiveOrExpression

ConditionalOrExpression:
  ConditionalAndExpression 
  ConditionalOrExpression || ConditionalAndExpression

&&gibi &sol işlenen ise sadece sağ işlenen değerlendirir dışında true. ||gibi |sol işlenen ise sadece sağ işlenen değerlendirir dışında false.

Koşullu-Ve aşağıdaki özelliklere sahiptir:

  • Koşullu ve operatör sözdizimsel olarak sol ilişkilidir (soldan sağa gruplar).
  • Koşullu ve operatör, hem yan etkiler hem de sonuç değeri açısından tamamen ilişkilidir. Kendisine, herhangi bir ifade için a, bve c, ifade değerlendirilmesi ((a) && (b)) && (c), aynı yan etkileri ifade değerlendirilmesi olarak, aynı sırada meydana gelen, aynı sonucu üretir (a) && ((b) && (c)).
  • Koşullu ve operatör her işlenen tipte olmalıdır booleanya da Booleanya da bir hata meydana gelen bir derleme.
  • Koşullu ve ifadenin türü her zamandır boolean.
  • Çalışma zamanında, önce sol taraftaki işlenen ifade değerlendirilir; sonucun türü varsa, kutudan çıkarmaBoolean dönüşümüne tabi tutulur ( §5.1.8 ).
  • Sonuçta elde edilen değer, falsekoşullu ve ifadenin değeri olur falseve sağ taraftaki işlenen ifadesi değerlendirilmez.
  • Sol taraftaki işlenenin değeri ise true, sağ taraftaki ifade değerlendirilir; sonucun türü varsa, kutudan çıkarmaBoolean dönüşümüne tabi tutulur ( §5.1.8 ). Ortaya çıkan değer, koşullu ve ifadenin değeri olur.
  • Böylece, &&aynı sonucu hesaplar &üzerinde booleanişlenen. Yalnızca sağ taraftaki işlenen ifadesinin her zaman değil koşullu olarak değerlendirilmesi bakımından farklılık gösterir.

Koşullu-Veya aşağıdaki özelliklere sahiptir:

  • Koşullu veya operatör sözdizimsel olarak sol ilişkilidir (soldan sağa gruplar).
  • Koşullu veya operatör, hem yan etkiler hem de sonuç değeri açısından tamamen ilişkilidir. Kendisine, herhangi bir ifade için a, bve c, ifade değerlendirilmesi ((a) || (b)) || (c), aynı yan etkileri ifade değerlendirilmesi olarak, aynı sırada meydana gelen, aynı sonucu üretir (a) || ((b) || (c)).
  • Koşullu veya operatörün her işleneni tür booleanveya olmalıdır Booleanveya derleme zamanı hatası oluşur.
  • Koşullu veya ifadenin türü her zaman geçerlidir boolean.
  • Çalışma zamanında, önce sol taraftaki işlenen ifade değerlendirilir; sonucun türü varsa, kutudan çıkarmaBoolean dönüşümüne tabi tutulur ( §5.1.8 ).
  • Sonuçta elde edilen değer, truekoşullu veya ifadenin değeri olur trueve sağ taraftaki işlenen ifadesi değerlendirilmez.
  • Sol taraftaki işlenenin değeri ise false, sağ taraftaki ifade değerlendirilir; sonucun türü varsa, kutudan çıkarmaBoolean dönüşümüne tabi tutulur ( §5.1.8 ). Ortaya çıkan değer, koşullu veya ifadenin değeri olur.
  • Böylece, açık veya işlenenlerle ||aynı sonucu hesaplar . Yalnızca sağ taraftaki işlenen ifadesinin her zaman değil koşullu olarak değerlendirilmesi bakımından farklılık gösterir.|booleanBoolean

Kısacası, @JohnMeagher yorumlarda defalarca işaret ettiği gibi &ve |aslında, işlenenlerin belirli bir durumunda kısa devre yapmayan boolean operatörler ya booleanda Boolean. İyi uygulamalarla (yani: ikincil etki yok), bu küçük bir farktır. Bununla birlikte, işlenenler booleans veya Booleans olmadığında , işleçler çok farklı davranırlar : bitsel ve mantıksal işlemler, yüksek düzeyde Java programlama ile iyi karşılaştırmaz.


2

1). (Expression1 | expression2), | operatör, expression1 öğesinin sonucunun doğru veya yanlış olup olmadığına bakılmaksızın expression2 öğesini değerlendirir.

Misal:

class Or 
{
    public static void main(String[] args) 
    {
        boolean b=true;

        if (b | test());
    }

    static boolean test()
    {
        System.out.println("No short circuit!");
        return false;
    }
}

2). (İfade1 || ifade2), || expression1 doğruysa operatör expression2 öğesini değerlendirmez.

Misal:

class Or 
{
    public static void main(String[] args) 
    {
        boolean b=true;

        if (b || test())
        {
            System.out.println("short circuit!");
        }
    }

    static boolean test()
    {
        System.out.println("No short circuit!");
        return false;
    }
}

1

|| iki değer OR'ing yaparak bir boole değeri döndürür (bu yüzden bunun LOGICAL veya

IE:

if (A || B) 

A veya B doğruysa true, ikisi de yanlışsa false döndürür.

| iki değer üzerinde bitsel işlem yapan bir operatördür. Bitsel işlemleri daha iyi anlamak için buradan okuyabilirsiniz:

http://en.wikipedia.org/wiki/Bitwise_operation


1

Temel farklardan biri || ve && "kısa devre" sergilediğinden, RHS yalnızca gerektiğinde değerlendirilecektir.

Örneğin;

if (a || b) {
    path1...
} else {
    path2..
}

Yukarıda a doğruysa b test edilmez ve path1 yürütülür. Eğer | kullanıldığında, her iki taraf da 'a' doğru olsa bile değerlendirilir.

Daha fazla bilgi için Buraya ve buraya bakın .

Bu yardımcı olur umarım.


1

Kısa devre yapmama yararlı olabilir. Bazen iki ifadenin değerlendirildiğinden emin olmak istersiniz. Örneğin, bir nesneyi iki ayrı listeden kaldıran bir yönteminiz olduğunu varsayalım. Bunun gibi bir şey yapmak isteyebilirsiniz:

class foo {

    ArrayList<Bar> list1 = new ArrayList<Bar>();
    ArrayList<Bar> list2 = new ArrayList<Bar>();

    //Returns true if bar is removed from both lists, otherwise false.
    boolean removeBar(Bar bar) {
        return (list1.remove(bar) & list2.remove(bar));
    }
}

Bunun yerine yönteminiz koşullu işlenen kullandıysa, ilk liste yanlış döndürülürse nesneyi ikinci listeden kaldıramaz.

//Fails to execute the second remove if the first returns false.
boolean removeBar(Bar bar) {
    return (list1.remove(bar) && list2.remove(bar));
}

Şaşırtıcı derecede kullanışlı değil ve (çoğu programlama görevinde olduğu gibi) başka yollarla da başarabilirsiniz. Ancak bitsel işlenenler için bir kullanım durumudur.


1

Aralarındaki temel fark şudur | önce değerleri binary'ye dönüştürür, sonra bit veya işlemi gerçekleştirir. Bu arada || verileri ikilik biçime dönüştürmez ve yalnızca orijinal durumunda veya ifadesini gerçekleştirir.

int two = -2; int four = -4;
result = two | four; // bitwise OR example

System.out.println(Integer.toBinaryString(two));
System.out.println(Integer.toBinaryString(four));
System.out.println(Integer.toBinaryString(result));

Output:
11111111111111111111111111111110
11111111111111111111111111111100
11111111111111111111111111111110

Daha fazla bilgi için: http://javarevisited.blogspot.com/2015/01/difference-between-bitwsie-and-logical.html#ixzz45PCxdQhk


İşlenenler boolean ve aptal biçimlendirme olduğunda gerçekleşmez.
Lorne Marquis

2
Neden Long.valueOf (100 | 200) = 236 olduğunu anlamama yardımcı oldu. İşte nedeni: 0 1 1 0 0 1 0 0 | 1 1 0 0 1 0 0 0 = 1 1 1 0 1 1 0 0 = 128 64 32 0 8 4 0 0 = 236
donlys

1

Bu soruyu sorduğumda bu konuda bir fikir edinmek için test kodu oluşturdum.

public class HelloWorld{

   public static boolean bool(){
      System.out.println("Bool");
      return true;
   }

   public static void main(String []args){

     boolean a = true;
     boolean b = false;

     if(a||bool())
     {
        System.out.println("If condition executed"); 
     }
     else{
         System.out.println("Else condition executed");
     }

 }
}

Bu durumda, koşul a veya b eklenirse yalnızca sol taraf değerini değiştiririz.

|| Senaryo, sol taraf true olduğunda [if (a || bool ())]

çıktı "If condition executed"

|| Senaryo, sol taraf yanlış olduğunda [if (b || bool ())]

Çıktı-

Bool
If condition executed

Conclusion of || Kullanım sırasında ||, sağ taraf sadece sol tarafın yanlış olduğunu kontrol eder.

| Senaryo, sol taraf true olduğunda [if (a | bool ())]

Çıktı-

Bool
If condition executed

| Senaryo, sol taraf yanlış olduğunda [if (b | bool ())]

Çıktı-

Bool
If condition executed

Conclusion of | Kullanırken |, hem sol hem de sağ tarafı kontrol edin.



0

genellikle artış öncesi ve artış sonrası operatör olduğunda kullanıyorum. Aşağıdaki koda bakın:

package ocjpPractice;
/**
 * @author tithik
 *
 */
public class Ex1 {

    public static void main(String[] args) {
    int i=10;
    int j=9;
    int x=10;
    int y=9;
    if(i==10 | ++i>j){
        System.out.println("it will print in first if");  
        System.out.println("i is: "+i);
    }

    if(x==10 ||++x>y){
        System.out.println("it will print in second if");   
        System.out.println("x is: "+x);
    }
    }
}

çıktı:


i: ise ilk önce yazdırılacaktır : 11 x: 10 ise

ikinci olarak yazdırılacaktır

her iki ifblok da aynıdır ancak sonuç farklıdır. olduğunda |, her iki koşul da değerlendirilecektir. Fakat eğer öyleyse, ||birinci koşul zaten doğru olduğu için ikinci koşulu değerlendirmeyecektir.


1
Bunu çok kafa karıştırıcı buluyorum
NimChimpsky

0

Sizin için gitmeli neden düşündüren pek çok kullanım örneği vardır ||ziyade |. Bazı kullanım durumları ,| tüm koşulları kontrol etmek için operatör kullanmalıdır .

Örneğin, form doğrulamasını denetlemek istiyorsanız ve kullanıcıya tüm geçersiz alanları yalnızca ilk geçersiz alan yerine hata metinleriyle göstermek istiyorsanız .

|| operatör,

   if(checkIfEmpty(nameField) || checkIfEmpty(phoneField) || checkIfEmpty(emailField)) {
      // invalid form with one or more empty fields
   }

   private boolean checkIfEmpty(Widget field) {
      if(field.isEmpty()) {
        field.setErrorMessage("Should not be empty!");
        return true;
      }
      return false;
   }

Dolayısıyla, yukarıdaki snippet ile, kullanıcı formu TÜM boş alanlarla gönderirse, SADECE nameFieldhata mesajı ile gösterilir. Ancak, bunu olarak değiştirirseniz,

   if(checkIfEmpty(nameField) | checkIfEmpty(phoneField) | checkIfEmpty(emailField)) {
      // invalid form with one or more empty fields
   }

trueKoşullara bakılmaksızın her alanda doğru hata mesajı gösterecektir .


0

Dikkatli bir şekilde okuduktan sonra, |mantıksal bir işleç olarak Java desen uygulamalarına uygun olup olmadığı hala bu konuda bana açık değil .

Geçenlerde bir yorum adresleme bir çekme isteği kodu değiştirdim nerede

if(function1() | function2()){
  ...
}

olarak değiştirilmeliydi

boolean isChanged = function1();
isChanged |= function2();
if (isChanged){
  ...
}

Kabul edilen gerçek sürüm nedir?

Java belgeleri edilir değil söz |mantıksal olmayan seviyedeki kısa VEYA operatörü olarak.

Oy kullanmakla ilgilenmiyor, ancak standardı bulmakta daha fazla mı ?! Her iki kod sürümü de beklendiği gibi derleniyor ve çalışıyor.





-2

| bitsel bir operatördür. || mantıklı bir operatördür.

Biri iki bit alacaktır.

Kişi doğruyu belirleyecektir (bu VEYA bu) Eğer bu doğruysa veya doğruysa, cevap doğrudur.

Oh, ve dang insanlar bu sorulara hızlı cevap veriyorlar.

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.