Ошибка присвоения значения переменной

Страницы: 1
RSS
Ошибка присвоения значения переменной
 
Добрый день. Подскажите почему строки
Код
dis_not = true  and false or true
dis_not = false and false or true
дают одинаковые значение true? Ведь должны давать разные.

если сделать так
Код
dis_not = true  and true or false
dis_not = false and true or false  

то все правильно выдает. В зависимости от от значения или true или false. А в первом варианте всегда true true.
Может это глюк LUA?
 
VargoR, добрый день.

Ошибок нет, результат верный.
Необходимо принимать во внимание порядок выполнения логических операций: конъюнкция ("and") имеет более высокий приоритет, чем дизъюнкция ("or").

Рассмотрим приведенные Вами выражения:

Код
dis_not = true  and false or true
1) исчисляется true and false, результат - false;
2) исчисляется false (результат п.1) or true, результат - true.

Код
dis_not = false and false or true
1) false and false, результат - false;
2) false or true, результат - true.

Код
dis_not = true  and true or false
1) true and true, результат - true;
2) true or false, результат - true.

Код
dis_not = false and true or false
1) false and true, результат - false;
2) false or false, результат - false.

Если требуется изменить порядок выполнения логических операций, необходимо воспользоваться скобками.
 
Добрый день.
Цитата
Anton Belonogov написал:
Необходимо принимать во внимание порядок выполнения логических операций: конъюнкция ("and") имеет более высокий приоритет, чем дизъюнкция ("or").Рассмотрим приведенные Вами выражения:
Кодdis_not = true  and false or true
1) исчисляется true and false, результат - false;
2) исчисляется false (результат п.1) or true, результат - true.

В том то и дело, что должен быть приоритет у and а его в выражении dis_not = true and false or true нет
вы написали результат "1) исчисляется true and false, результат - false" но результат НЕ false. Hезультат выполнения true. Хотя должен быть false. Выполните пожалуйста команду убедитесь.
 
VargoR,

Цитата
"1) исчисляется true and false, результат - false" но результат НЕ false. Hезультат выполнения true. Хотя должен быть false.

Результат исчисления "true and false" - false, расхождений поведения программы с ожидаемым результатом нет.
Просим Вас уточнить, каким образом Вы получили результат true для выражения "true and false".
 
Цитата
Anton Belonogov написал:
VargoR,

Цитата
"1) исчисляется true and false, результат - false" но результат НЕ false. Hезультат выполнения true. Хотя должен быть false.

Результат исчисления "true and false" -  false , расхождений поведения программы с ожидаемым результатом нет.
Просим Вас уточнить, каким образом Вы получили результат  true  для выражения "true and false".
Прилагаю скрин как я это делаю и какой результат получаю.
 
VargoR,


Результат корректный. Выше уже был приведен разбор данного выражения.
Цитата
Код
  dis_not  =   true    and   false   or   true   
1) исчисляется true and false, результат - false;
2) исчисляется false (результат п.1) or true, результат -  true .
 
Видимо я что-то недопонимаю в вашем ответе.
Ваш ответ рушит всю логику выражения.

вы написали "true and false, результат - false;"

Вы это выражение имели ввиду dis_not  =   true    and   false   or   true ?  

Если речь о нем, то оно не дает false у меня оно дает true, хотя должно и просто обязано выдать false, так как после and стоит первым false, а условие после "=" истинно
Пожалуйста напишите, какой результат по вашему должно дать выражение dis_not=true and false or true
 
Цитата
VargoR написал:
dis_not=true and false or true
true

по правилам, раз нет скобок, то проверка по очереди
распишите выражение на два
сначала
temp = true and false --получим false
потом
dis_not= temp or true --получим true

это то же самое что
dis_not= true and false or true --получим true
 
Цитата
Sergey Gorokhov написал:
по правилам, раз нет скобок, то проверка по очереди
распишите выражение на два
сначала
temp = true and false --получим false
потом
dis_not= temp or true --получим true

это то же самое что
dis_not= true and false or true --получим true

Наконец то понял, так как первый результат false продолжает вычисляться второе выражение.
Но если условие после равно истинно, мне нужно получать именно первый результат после and, независимо от того false оно или нет.

поменял код на
dis_not = not true  and true or false
или

dis_not = not false and true or false
все стало работать как нужно.
Благодарю.
 
Цитата
VargoR написал:
dis_not = true  and false or true
dis_not = false and false or true
дают одинаковые значение true?
Ведь должны давать разные.если сделать такКод
dis_not = true  and true or false
dis_not = false and true or false  

приоритет логических операций  определяется их порядком слева на право.
--------------------------
В данных примерах первым исполняется AND потом  OR
true and false ==false
true and true==true
-----------------
в итоге имеем
dis_not = (true  and false) or true=(false or true)=true
dis_not = (false and false) or true= true
---------------------
dis_not = (true  and true) or false=true
dis_not = (false and true) or false =(false or false)=false
-----------------
в результат  всех операторов :
true true
true false
=================
Резюме:
Автор не знает булевой алгебры.
читайте учебники.
 
Цитата
nikolz написал:
Цитата
VargoR написал:
dis_not = true  and false or true
dis_not = false and false or true
дают одинаковые значение true?
Ведь должны давать разные.если сделать такКод
dis_not = true  and true or false
dis_not = false and true or false  

приоритет логических операций  определяется их порядком слева на право.
--------------------------
В данных примерах первым исполняется AND потом  OR
true and false ==false
true and true==true
-----------------
в итоге имеем
dis_not = (true  and false) or true=(false or true)=true
dis_not = (false and false) or true= true
---------------------
dis_not = (true  and true) or false=true
dis_not = (false and true) or false =(false or false)=false
-----------------
в результат  всех операторов :
true true
true false
=================
Резюме:
Автор не знает булевой алгебры.
читайте учебники.
Не знаю поэтому и спрашиваю. Учебники будем читать когда скрипт допишем:)

Еще оказывается. Так как мне переменная нужна была для сборки командной   строки для телеграмм для параметра disable_notification, можно было   результат получать в кавычках.
dis_not = true and "false" or "true"а если потом нужно было boolean значение то пользоваться функцией
function toboolean(str)
   local bool = false
   if str == "true" then
       bool = true
   end
   return bool
end
 
function toboolean(str)
  return str == "true"
end
Страницы: 1
Читают тему
Наверх