И/ИЛИ (&&/||) логика за множество изрази за условие [затворено]

Ако имате оператор if в C#, който проверява множество условия:

if (a == 5 && b == 9) { ... }

Все още ли се проверява b == 9, ако условието a == 5 е невярно, или автоматично излиза, тъй като вече няма начин това да премине?

По същия начин, за оператор OR if:

if (a == 5 || b == 9) { ... }

Ще се провери ли b == 9, ако a == 5 е вярно?


person miguelarcilla    schedule 19.12.2013    source източник
comment
Съжаляваме, но прочетете ръководството. Това е въпрос, на който може да се отговори от документацията и като я изпробвате сами.   -  person Tim Schmelter    schedule 19.12.2013
comment
@TimSchmelter Честно. Предполагам, че просто не бях сигурен как да формулирам въпроса си за търсачка   -  person miguelarcilla    schedule 19.12.2013
comment
вие питате за функционалността на операторите. Така че следващия път можете да включите този термин в търсенето, напр. C# оператор.   -  person Tim Schmelter    schedule 19.12.2013


Отговори (6)


И &&, и || са оператори за "късо съединение", което означава, че ако отговорът е известен от левия операнд, десният операнд не се оценява.

Това означава, че:

a && b

b няма да бъде оценено, ако a е невярно, тъй като окончателният отговор вече е известен.

По същия начин:

a || b

b няма да бъде оценено, ако a е вярно, тъй като окончателният отговор вече е известен.

Ако искате и двата операнда да бъдат оценени, използвайте вместо това операторите & и |.

Бонусът от това е, че можете да пишете изрази, които биха се провалили, ако всички операнди бяха оценени. Ето един типичен if-изявление:

if (a != null && a.SomeProperty != null && a.SomeProperty.Inner != null)
    ... use a.SomeProperty.Inner

Ако a беше null и изразът ще продължи да оценява a.SomeProperty, той ще хвърли NullReferenceException, но тъй като && късо съединение, ако a е null, изразът няма да оцени останалото и по този начин няма да хвърли изключението.

Очевидно, ако замените && с &, то ще хвърли това изключение, ако a или a.SomeProperty е null.

person Lasse V. Karlsen    schedule 19.12.2013

Концептуално, && и || късо съединение.

Но тъй като нямате никакви странични ефекти там, JIT компилаторът е свободен да премахне късото съединение. Не знам дали наистина е така или не.

person harold    schedule 19.12.2013

За: if (a == 5 && b == 9) { ... }

Все още ли се проверява b == 9, ако условие == 5 е невярно, или автоматично излиза, тъй като вече няма начин това да премине?

Ако a == 5 е false, никаква друга контрола няма да бъде изпълнена на този ред.

За: if (a == 5 || b == 9) { ... }

Ще бъде ли проверено b == 9, ако a == 5 е вярно?

Влезте веднага вътре, тъй като първото условие вече отговаря на изискванията.

person Tigran    schedule 19.12.2013

Използвайки оператора AND, според булевата логика, всички условия трябва да бъдат оценени като TRUE. Ако само едно от тях не е изпълнено, резултатът от условията ще бъде FALSE.

Все още ли се проверява b == 9, ако условие == 5 е невярно, или автоматично излиза, тъй като вече няма начин това да премине?

Излиза автоматично, защото първото условие е невярно и резултатът вече е известен.

За оператора OR трябва поне едно от условията да е TRUE и вашата логика ще бъде изпълнена. Ако първото не е изпълнено, приложението ще провери останалите условия.

Ще бъде ли проверено b == 9, ако a == 5 е вярно?

Не, няма да се провери, защото първото условие е ВЯРНО и след това не е необходимо да се проверява друго условие.

person Alberto Solano    schedule 19.12.2013
comment
Искам да разбера причината за това отрицателно гласуване.. - person Alberto Solano; 19.12.2013

Късото съединение се определя от стандарта. В противен случай би било невъзможно да се каже какъв е резултатът от израз като:

if (a != null && a.IsValid) { ... }

В някои C# компилатори ще работи добре, в някои други ще предизвика изключение. Ето защо стандартът е там, за да дефинира обичайното поведение.

РЕДАКТИРАНЕ: изяснено последно твърдение.

person Zoran Horvat    schedule 19.12.2013

в И проверете a==5 ако е вярно, тогава ще отиде на b==9 иначе няма да отиде на b==9. в ИЛИ: ще провери a==5 и b==9.

person Fahad Alenazi    schedule 19.12.2013
comment
Здравей user3119036 добре дошъл в SA. вашият отговор е ОК, но има нужда от анализ, проверете какво направих. - person Nahum; 19.12.2013