Повідомлення створено: 22. 01. 2016 [20:06]
|
dorn
Максим Алексеев
Автор теми
Зареєстрован(а) с: 24.10.2015
Повідомлення: 17
|
Здравствуйте, Роман.
На Ubuntu 14.04 обновился недавно до версии 0.8.15.
В JavaLikeCalc произошёл сбой приоритетов операций. На строку такого вида:
false && true || false == false
выдаёт false.
|
Повідомлення створено: 22. 01. 2016 [21:03]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"dorn" wrote:
Здравствуйте, Роман.
На Ubuntu 14.04 обновился недавно до версии 0.8.15.
В JavaLikeCalc произошёл сбой приоритетов операций. На строку такого вида:
false && true || false == false
выдаёт false.
Правильно, поскольку для этих операций не работают приоритеты, а работает последовательная проверка-вычисление операций условий в контексте. Скобки просто ставьте!
Не ошибка!
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 24. 01. 2016 [13:36]
|
IrmIngeneer
Константин \m/
Contributor Sponsor
Зареєстрован(а) с: 16.09.2010
Повідомлення: 185
|
"dorn" wrote:
... обновился недавно до версии 0.8.15.
В JavaLikeCalc произошёл сбой приоритетов операций. На строку такого вида:
false && true || false == false
выдаёт false.
В 0.8.14 точно так же.
А в какой не так?
|
Повідомлення створено: 25. 01. 2016 [08:50]
|
dorn
Максим Алексеев
Автор теми
Зареєстрован(а) с: 24.10.2015
Повідомлення: 17
|
Да, может и в 8.14 тоже так было..
В таком случае нужно в документации
http://wiki.oscada.org/Doc/JavaLikeCalc?v=13mz п.1.2
пометить операции && и || одним цветом
|
Повідомлення створено: 25. 01. 2016 [11:16]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
OK, помечу.
Собственно ранее, в упрощённой реализации, эти приоритеты там и работали. А потом, кода добавилась условная проверка-исполнение последующего подвыражения, приоритеты там работать перестали. Да собственно в том-же С++ именно по этой причине компилятор ругается когда смешиваются операции "||", "&&" и я лично всегда их скобками выделяю.
Что касается условной проверки, то, например, для выражения ниже функция extCheckCall() вообще будет вызываться только в случае v1 = false.
rez = v1 || extCheckCall();
А для выражений ниже становится возможной динамическая работа в принципе:
if(nPnt && (rVal=nPnt.extCheckCall())) {SomeDo};
Learn, learn and learn better than work, work and work.
|