Java-dagi if blokida mantiqiy operator yoki bitli operatordan foydalanish o'rtasida farq bormi?

Quyidagi ikkala if blokining mazmuni bajarilishi kerak:

if( booleanFunction() || otherBooleanFunction() ) {...}
if( booleanFunction() | otherBooleanFunction() ) {...}

Xo'sh, | dan foydalanish yoki || dan foydalanish o'rtasidagi farq nima?

Eslatma: Men buni ko'rib chiqdim va o'zimning javobimni topdim, uni quyida kiritdim. Iltimos, meni to'g'rilang yoki o'z fikringizni bildiring. Albatta, yaxshilanish uchun joy bor!


person Miquel    schedule 22.06.2012    source manba
comment
Men bu savolning mohiyatini tushunmadim, siz o'zingiz javob beradigan savolni berasiz - boshqalar javob berishidan oldin?   -  person Nim    schedule 22.06.2012
comment
@Nim va Durandal: Hmm.. Men nuqtani o'tkazib yuborgan bo'lishim mumkin, lekin buagar bu boshqalarga tegishli bo'lishi mumkin deb hisoblasangiz, o'zingizning savollaringizga javob bersangiz yaxshi bo'ladi. Men o'z savolimni hal qildim va baham ko'raman deb o'yladim, shuning uchun uni bu erda hujjatlashtirish muammosiga duch keldim. Hech kimni xafa qilmoqchi emasdim   -  person Miquel    schedule 22.06.2012
comment
@Miquel, bu xafa qilish haqida emas, IMO bu savolga darhol javob berdingiz, bu siz bema'nilarga (masalan, men kabi! :)) obro'-e'tiboringizni oshirishga harakat qilayotganingizni ko'rsatadi, keyingi safar nima bo'lishini ko'rish uchun biroz vaqt ajrating. hamjamiyat ishlab chiqaradi va agar siz to'g'ri javob topmasangiz, hissa qo'shing - u har qanday ko'rinishni yo'q qiladi ...   -  person Nim    schedule 22.06.2012
comment
@Nim yaxshi, nuqta olingan. Shubhasiz, bu noto'g'ri talqin qilingan, shuning uchun men kelajakda siz taklif qilgandek qilaman va shu bilan birga muhokamani metaga o'tkazaman. Ehtimol, savolni joylashtirish uchun to'g'ridan-to'g'ri quti ostidagi savolingizga o'z savolingizga javob bermasligimiz kerak.   -  person Miquel    schedule 22.06.2012
comment
Men katta ish nima ekanligini tushunmayapman. Balki, Mikel erishmoqchi bo'lgan ishini tugatish uchun kun bo'yi kutishga to'g'ri kelmagandir. Agar men o'sha vaziyatda bo'lganimda va mening savolimga etarlicha yechim bo'lsa, men shunchaki ko'rinishni kutmagan bo'lardim.   -  person Stack Underflow    schedule 03.02.2015


Javoblar (5)


Ikkisi turli xil foydalanishga ega. Garchi ko'p hollarda (boolean bilan ishlashda) ular bir xil ta'sirga ega bo'lib tuyulishi mumkin bo'lsa-da, mantiqiy-OR qisqa tutashuv ekanligini ta'kidlash kerak, ya'ni agar uning birinchi argumenti rost bo'lsa, ikkinchi argument qoladi. baholanmagan. Bit bo'yicha operator har ikkala argumentni ham baholaydi.

Xuddi shunday, mantiqiy-VA qisqa tutashuvdir, ya'ni agar uning birinchi argumenti noto'g'ri deb baholansa, ikkinchisi baholanmagan bo'ladi. Shunga qaramay, bitli-AND emas.

Siz buni amalda ko'rishingiz mumkin:

int x = 0;
int y = 1;
System.out.println(x+y == 1 || y/x == 1);
System.out.println(x+y == 1 |  y/x == 1);

Birinchi chop etish bayonoti juda yaxshi ishlaydi va birinchi argument rost deb baholangandan beri true qiymatini qaytaradi va shuning uchun baholash to'xtaydi. Ikkinchi chop etish bayonotida xatolik yuz beradi, chunki u qisqa tutashuv emas va nolga bo'linish sodir bo'ladi.

person arshajii    schedule 22.06.2012

Mantiqiy operator mantiqiy, bitli operator esa bitlarda ishlaydi. Bunday holda, ta'sir bir xil bo'ladi, lekin ikkita farq bor:

  1. Bitli operator buning uchun mo'ljallanmagan, bu o'qishni qiyinlashtiradi, lekin eng muhimi
  2. Mantiqiy OR operatori birinchi shartni baholaydi. Agar bu rost bo'lsa, keyingi shart nimaga olib kelishi muhim emas, natija to'g'ri bo'ladi, shuning uchun ikkinchi band bajarilmaydi

Buni isbotlash uchun bir nechta qulay kod:

public class OperatorTest {

    public static void main(String[] args){
        System.out.println("Logical Operator:");
        if(sayAndReturn(true, "first") || sayAndReturn(true, "second")){
            //doNothing
        }

        System.out.println("Bitwise Operator:");
        if(sayAndReturn(true, "first") | sayAndReturn(true, "second")){
            //doNothing
        }
    }

    public static boolean sayAndReturn(boolean ret, String msg){
        System.out.println(msg);
        return ret;
    }
}
person Miquel    schedule 22.06.2012
comment
Xo'sh, if iborasida & operatoridan amaliy foydalanish bormi? - person eaglei22; 10.07.2018
comment
Uni qo'llashning yagona nuqtasi ikkala bandni ham yon ta'sir sifatida bajarishdir va men buni juda yomon fikr deb hisoblayman, chunki siz birinchi navbatda nojo'ya ta'sirlarga tayanmasligingiz kerak va bu noto'g'ri o'qish juda oson - person Miquel; 11.07.2018

dasturchilar uchun faqat bitta farq bor.

  1. sizning mantiqiy operatorlaringiz mantiqiydir, ya'ni. ular faqat bitta shartni sinab ko'rishadi va shunga asoslanib natija olishadi.

booleanFunction() || otherBooleanFunction()agar biri rost bo'lsa, rost bo'ladi. xuddi shunday, agar ikkalasi ham noto‘g‘ri bo‘lsa, booleanFunction() && otherBooleanFunction() ham noto‘g‘ri bo‘ladi. Xo'sh, nima uchun boshqasini sinab ko'rish kerak. mantiqiy operatorlar shunday qiladi.

Ammo bitlilar ikkalasini ham tekshiradi. Ushbu kontseptsiyaning tez-tez qo'llanilishi quyidagicha.

if(someObject != null && someObject.somemethod())

Shunday qilib, agar siz && ni & ga almashtirsangiz, falokatni kuting. Tez orada yomon NullPointerException olasiz...

person Ahmad    schedule 22.06.2012

if( booleanFunction() || otherBooleanFunction() ) {...}

Bu holatda, agar booleanFunction() true ni qaytarsa, otherBooleanFunction() bajarilmaydi.

if( booleanFunction() | otherBooleanFunction() ) {...}

Ammo bitli operatorda ikkala funksiya - booleanFunction() va otherBooleanFunction() bajariladi, booleanFunction() true yoki false qaytarsa ​​ham bajariladi.

person Pramod Kumar    schedule 22.06.2012

Bit bo'yicha va mantiqiy operator o'rtasidagi farq - 1. Bit yo'nalishi bo'yicha operator bitda, mantiqiy operator esa bayonotda ishlaydi. 2. Bit bo'yicha va & bilan ifodalanadi, mantiqiy va && bilan ifodalanadi. 3. Bitli yoki | bilan ifodalanadi mantiqiy yoki || bilan ifodalanadi.

person Rajeev jha    schedule 27.05.2015