Последователност на изпълняване на логическите оператори?
Здравейте,
Искам да ви попитам каква е последователността при изпълняване на логическите опрератори, когато имаме повече от 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 стойности с "|" и "&" (побитови логически операции) винаги ли връща еднаква стойност, както при сравняването със съответно "||" и "&&".
https://imgur.com/a/b4moN
При първият пример започваме да проверяваме отляво надясно (както спомена) всяка двойка и излиза, че накрая отговорът ще ни е "false", но Visual Studio връща "true".
Но ако проследим двойките отдясно наляво, тогава резултатът ще ни е "true", както си ни го връща и програмата.
Затова и не мога да си обясня защо така се получава след като правилото е "винаги отляво надясно".
На картинката, която си дал, си изпуснал приоритета на && преди ||, но всъщност дотам въобще не се стига.
Когато имаме логическо "или", компилаторът почва проверките отляво надясно, НО до първото срещнато true. Щом види true, последвано от ||, спира да гледа нататък и връща true.
(true || false) връща true, (false || true) също връща true. Затова, ако нещо е по-вероятно да върне true, го слагаме отляво, за да спестим проверки.