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

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

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
TeodorStefanovPld avatar TeodorStefanovPld 358 Точки

винаги е отляво надясно... и винаги проверява първия и ако е 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 232 Точки

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

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

 

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

 

0
14/01/2018 13:11:13