Булевые операции и приоритеты

 
Print(0 && 1 || 1 && 1); // Возвращает 0 - неправильно
Print((0 && 1) || (1 && 1)); // Возвращает 1
Непонятно, почему у логического ИЛИ приоритет выше, чем у И???

То есть разработчики считают, что вначале выполняется действие сложение, а потом умножение? :)
Опровергается вся теория булевой алгебры... да и вообще математики.

Разработчики, почему так???

МТ4 билд 208
 
После первого ложного высказывания дальнейшая проверка прекращается. По моему так.
 

Да какая разница, какие приоритеты. Я всегда скобки ставлю и не гружусь этими высокими материями. А вообще да, это действительно странно. Но об этом сами метаквоты и пишут в самом конце справки о приоритетах. Так что первый пример интерпретируется так:

Print(0 && ( 1 || 1 ) && 1); // Возвращает 0 - правильно!
 
2 Vinin: Во второй строчке указанного кода опровергается Ваше утверждение.
 
2 Mathemat:
А почему у Вас такой ник? :)
А если бы "0*1+1*1" возвращало бы ноль? Это тоже бы никого не смущало? :)

Внизу справки о приоритетах написано:
"Внимание: приоритет выполнения операций в языке MQL4 несколько отличается от приоритета, принятого в языке Си"
Но если б там внизу было написано: "В языке MQL4 используется наша собственная математика, не совпадающая с общепринятой. Помните! 2+2=5 в MQL4!"
То было бы все понятно.
А так... это дикий баг :)
 

Это не баг, а фича этого языка, которая меня тоже смутила, если откровенно. Но я на нее ни разу не наталкивался, так как допускал, что лучше заложиться на особенности реализации булевой алгебры в этом языке, и всегда ставил скобки: в булевой алгебре приоритеты не настолько однозначны, как в рихметике. И они относятся не к собственно алгебре, а к ее реализации.

Почему у меня такой ник, не скажу, это мой ноу-хау.

 
Mathemat писал (а):

Тем не менее в булевой алгебре приоритеты не настолько однозначны, как в рихметике. И они относятся не к собственно алгебре, а к ее реализации.

Однозначны. Это скажет любой Математик. :)
 
Люди уже давно подметили его:
https://www.mql5.com/ru/forum/49796

А разработчики проигнорировали.
 
Vinin:
После первого ложного высказывания дальнейшая проверка прекращается. По моему так.

Правильно, только это касается только опреатора AND. Раз скобок нет он проверил первый элемент и далбше уже нет нужды. А когда есть еще ИЛИ и есть скобки, то проверяется все выражение. Так кажись.
 

ARray, я не Математик, а всего лишь Mathemat... Этимологию ника не скажу, хоть на куски меня режь.

Если каждая пятая домохозяйка в нашей стране все же сможет правильно вычислить 2 + 2 * 2, это не дает тебе оснований утверждать, что ее будет волновать результат выражения 0 && 1 || 1 && 1 , так как она даже и не знает, что это такое. Шутка.

ARray, меня такой приоритет тоже смущает, поверь мне, но нисколько мне не мешает. Понимаешь разницу?

 

Приоритет простой - сначала && потом || потом сравнения в порядке следования. При этом нет разницы над чем &&.

Целые перемножаются побитово, от плавающих берется целая часть и тоже побитово перемножается. 3 && 1 дает 1, 4 && 1 дает 0. :-)))

Смотри 'Преобразование bool к int - значения'

Причина обращения: