Софтуерно Инженерство
Loading...
+ Нов въпрос
Ivelin91 avatar Ivelin91 0 Точки

Последователност на изпълняване на логическите оператори?

Здравейте,

Искам да ви попитам каква е последователността при изпълняване на логическите опрератори, когато имаме повече от 2.

До колкото знам се сравняват по двойки и резултатът от изпълнението на първата двойка се сравнява със следващия, след това този резултат се сравнява със следващия и т.н. Но откъде започва сравнението и реда на изпълнение - отляво-надясно или отдясно-наляво?

Отдолу имам 2 примера, в които се опитах да тествам това във Visual Studio, за да се уверя от само себе си - но това доведе до повече объркване.

Пример 1 :

bool result = true || false || true && false;      // true 

bool resultLeft = ((true || false) || true) && false;    // false
bool resultRight = true || (false || (true && false));  // true
 

Този пример връща еднакъв резултат, при реда, в който изкуствено е манипулирано със скоби първоначално да се изпълняват операциите отдясно-наляво.

 

Пример 2:

bool result = false && false || true && false || true && false || true || true;              // true

bool resultLeft = ((((((false && false) || true) && false) || true) && false) || true) || true;   // true
bool resultRight = false && (false || (true && (false || (true && (false || (true || true))))));  // false

Този пример връща еднакъв резултат, при реда, в който изкуствено е манипулирано със скоби първоначално да се изпълняват операциите отляво-надясно.

 

Какво е правилото и къде бъркам?

 

2ри Въпрос:  при сравняване на bool стойности с  "|" и "&" (побитови логически операции) винаги ли връща еднаква стойност, както при сравняването със съответно "||" и "&&". 
 

0
Основи на програмирането 13/01/2018 11:17:31
KeepCoding avatar KeepCoding 282 Точки
Best Answer

Виж частта, където пише "Приоритет на операторите в C#"

https://www.introprogramming.info/intro-csharp-book/read-online/glava3-operatori-i-izrazi/#_Toc298863965

Там "&&" е с по-висок приоритет от "||". Малко по-нависоко в таблицата пише същото и за операторите за аритметични операции. Представи си че "&&" е като умножение (като приоритет), а "||" е като събиране. Като пример да видим първата ти операция:

bool result = true || false || true && false; което ако можем да го отъждествим като аритметична операция би изглеждало така: 

резултат = число1 + число2 + число3 * число4. Естествено първата операция, която ще се изпълни ще бъде число3 * число4. И обратно към кодът - първата операция, която ще се изпълни ще бъде "true && false". Ако има операции с един и същ приоритет на изпълнение, се изпълняват от ляво надясно (както и е при аритметичните операции). Т.е. след като бъдат изпълнени всички "&&" оператори (от ляво надясно) започват да се изпълняват всички "||" оператори от ляво надясно. И отново както при аритметичните операции, и при логическите операции скобите променят приоритета. Мен лично ме мързи да помня приоритетът на логическите оператори и ползвам скоби.

0
Ivelin91 avatar Ivelin91 0 Точки

Благодаря много за отличното обяснение! 

0
Angel_Kalinkov avatar Angel_Kalinkov 111 Точки

Здравей колега! Още не съм се запознал със С#, но предполагам, че няма разлика с Java. Надявам се, че няма да те объркам повече!

Логическите (булеви) оператори са двуаргументни и са ляво-асоциативни, тоест изчисляват се от ляво на дясно. && e с приоритет пред ||, а операторът () служи за промяна в приоритета на изпълнение.

0
13/01/2018 11:34:42
TeodorStefanovPld avatar TeodorStefanovPld 950 Точки

нали ти казах,зависимост от условието те сравняват и това ти връщат..вземи прочети малко повече.иначе айде гледаме твойте 3 примера :

bool result true || false  връща true  true&& false  връща  false и общо взето сравняваш   двата резултата. имаш отляво: true ||  отдясно: false и ти връща true... 

другото можеш сам да си го обясниш

0
TeodorStefanovPld avatar TeodorStefanovPld 950 Точки

винаги е отляво надясно... и винаги проверява първия и ако е true  връща него. но трябва да има условие ти така както си го написал  ти  ги връща съвсем нормално. Това са логически операции незнам защо си мислиш че манипулираш редовете по някакъв начин. Компилатора започва да чете кода и проверява редовете един по един и връща каквото е прочел....

Май по-скоро не си разбрал какво е bool и какво прави...

0
Ivelin91 avatar Ivelin91 0 Точки

https://imgur.com/a/b4moN

При първият  пример започваме да проверяваме отляво надясно (както спомена) всяка двойка и излиза, че накрая отговорът ще ни е "false", но Visual Studio връща "true". 
Но ако проследим двойките отдясно наляво, тогава резултатът ще ни е "true", както си ни го връща и програмата.

Затова и не мога да си обясня защо така се получава след като правилото е "винаги отляво надясно".

 

0
13/01/2018 11:33:42
simeon3000 avatar simeon3000 265 Точки

На картинката, която си дал, си изпуснал приоритета на && преди  ||, но всъщност дотам въобще не се стига.

Когато имаме логическо "или", компилаторът почва проверките отляво надясно, НО до първото срещнато true. Щом види true, последвано от ||, спира да гледа нататък и връща true.

 

(true || false) връща true, (false || true) също връща true. Затова, ако нещо е по-вероятно да върне true, го слагаме отляво, за да спестим проверки.

 

0
14/01/2018 13:11:13