![]() |
#1 |
Участник
|
Логические операции в Х++
Сидел сегодня слушал презентацию
AXUG Workshop - X++ Tips and Tricks 071107.wmv от команды X++ в Redmond. И сделал для себя открытие (как приятно их все-таки делать ![]() Может это конечно только я один такой, но все же решил запостить. Вдруг еще кому-то глаза откроет. Оказывается, в Х++ операция && не имеет приоритета над операцией || И я даже помню, что что-то об этом вроде бы было в Dev Guide, но видимо я не обратил на это внимание. Сразу судорожно начал вспоминать последние условные операторы, которые я писал ![]() Хорошо хоть ума хватает в скобки всегда брать те выражения, которые я хочу, чтобы выполнились первыми. ![]() Вот Job, на котором этот эффект хорошо видно X++: Peter Villadsen , . :) , :p static void tutorial_LogicalExpressions(Args _args) { boolean a,b,c; ; print "Выражения:"; print "a || b && c"; print "b && c || a"; print ""; print "a = false, b = false, c = false"; print a || b && c; print b && c || a; a = true; print "a = true, b = false, c = false"; print a || b && c; print b && c || a; c = true; print "a = true, b = false, c = true"; print a || b && c; print b && c || a; pause; } |
|
|
За это сообщение автора поблагодарили: alex55 (1). |
![]() |
#2 |
Участник
|
Хехе...
Майкрософт как всегда изобретает свой велосипед, не совместимый с другими. Но я все равно буду всегда ставить скобки и считать что операция ИЛИ менее приоритетна по отношению к И. Чтобы не лохануться потом в другом языке. Мда. И теперь надобудет внимательнее смотреть что пишу в условиях в аксапте, чтобы не получить неожиданное поведение только потому что не поставил где-то скобки...
__________________
С уважением, Dozer Последний раз редактировалось Dozer; 10.08.2007 в 19:56. Причина: Дополнение |
|
![]() |
#3 |
Участник
|
Цитата:
Тут Майкрософт винить не стоит. Х++, со всеми плюсами и минусами, они взяли у Дамгаарда. Поэтому если и боконули, то как раз датчане ![]() |
|
![]() |
#4 |
Участник
|
Цитата:
Вот оно где корень проблемы ![]() |
|
![]() |
#5 |
Moderator
|
Сейчас залез в фолиант Еременко, Шашкова и уточнил по таблице на стр. 102. Так вот, логические операторы И и ИЛИ, т.е. двойные && и || , действительно имеют одинаковый приоритет. А вот бинарное И, т.е. одиночное &, имеет приоритет над бинарным ИЛИ, т.е. одиночным | . Видимо, отсюда некоторая путаница в умах... Честно говоря, не припомню, чтобы мне когда-либо приходилось в Аксапте применять бинарные операции.
|
|
![]() |
#6 |
Участник
|
Вот что пишут об этой теме пишут в блоге X++ Compiler Developer Team:
http://blogs.msdn.com/x/archive/2007...ce-of-and.aspx |
|
![]() |
#7 |
Banned
|
|
|
![]() |
#8 |
Участник
|
Цитата:
![]() Я вообще очень "прилежный". ![]() |
|
![]() |
#9 |
Участник
|
эх блин, почему ж я раньше не прочитал эту статью!
у меня был запрос ... && ((A) || (B ||C) && (D || E)) а надо было писать ... && ((A) || ((B ||C) && (D || E))) или хотя бы ... && ((B ||C) && (D || E) || A) Последний раз редактировалось CHESER85; 28.08.2013 в 09:32. |
|
![]() |
#10 |
Участник
|
Кстати, в 2012-й никто не проверял как это работает ?
Неужели так и оставили. |
|
![]() |
#11 |
Участник
|
|
|
![]() |
#12 |
Участник
|
А я бы убрал.
Все равно X++ - экзотика. Все больше и больше кода пишется на .Net Для других программистов кто не знаком с X++ это подстава. Никто не ожидает такого поведения. Ну то есть если оставить то потенциальных ошибок будет больше чем если убрать. |
|
![]() |
#13 |
Участник
|
К сожалению, так и не добавили логический XOR, приходится использовать бинарный ^. Кстати, если кто вдруг не в курсе, бинарные && и || не вычисляют второй операнд, если первый уже однозначно определяет результат. Ну это во всех языках одинаково.
![]() Пример: X++: public boolean updateSuccessful(SalesId _salesId) { SalesTable salesTable; boolean ret = true; ; try { ttsBegin; select forUpdate salesTable where salesTable.SalesId == _salesId; ... salesTable.update(); ttsCommit; } catch (Exception::Error) { ttsAbort; ret = checkFailed("Unknown error while updating"); } return ret; } public void execute() { // Если init() вернет false, второй метод не вызовется // если в любом случае нужно вызывать updateSuccessful(), надо использовать одиночный & if (this.init() && this.updateSuccessful(salesId)) { this.run(); } }
__________________
// no comments |
|
![]() |
#14 |
Участник
|
|
|
![]() |
#15 |
Участник
|
Глвное что бы при компиляции кода X++ в CIL приоритеты не менялись
![]() В AX2012 с этим все в порядке? |
|
![]() |
#16 |
Участник
|
Они не могут меняться - приоритеты реализуются на уровне парсера, а он - тот же самый. Компиляция il использует байткод x++ в качестве входного языка, а не сам x++
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |