10.08.2007, 19:42 | #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). |
10.08.2007, 19:49 | #2 |
Участник
|
Хехе...
Майкрософт как всегда изобретает свой велосипед, не совместимый с другими. Но я все равно буду всегда ставить скобки и считать что операция ИЛИ менее приоритетна по отношению к И. Чтобы не лохануться потом в другом языке. Мда. И теперь надобудет внимательнее смотреть что пишу в условиях в аксапте, чтобы не получить неожиданное поведение только потому что не поставил где-то скобки...
__________________
С уважением, Dozer Последний раз редактировалось Dozer; 10.08.2007 в 19:56. Причина: Дополнение |
|
10.08.2007, 21:58 | #3 |
Участник
|
Цитата:
Тут Майкрософт винить не стоит. Х++, со всеми плюсами и минусами, они взяли у Дамгаарда. Поэтому если и боконули, то как раз датчане |
|
10.08.2007, 22:21 | #4 |
Участник
|
Цитата:
Вот оно где корень проблемы |
|
10.08.2007, 22:25 | #5 |
Moderator
|
Сейчас залез в фолиант Еременко, Шашкова и уточнил по таблице на стр. 102. Так вот, логические операторы И и ИЛИ, т.е. двойные && и || , действительно имеют одинаковый приоритет. А вот бинарное И, т.е. одиночное &, имеет приоритет над бинарным ИЛИ, т.е. одиночным | . Видимо, отсюда некоторая путаница в умах... Честно говоря, не припомню, чтобы мне когда-либо приходилось в Аксапте применять бинарные операции.
|
|
10.08.2007, 22:28 | #6 |
Участник
|
Вот что пишут об этой теме пишут в блоге X++ Compiler Developer Team:
http://blogs.msdn.com/x/archive/2007...ce-of-and.aspx |
|
11.08.2007, 15:22 | #7 |
Banned
|
|
|
11.08.2007, 15:26 | #8 |
Участник
|
Цитата:
Я вообще очень "прилежный". |
|
28.08.2013, 09:23 | #9 |
Участник
|
эх блин, почему ж я раньше не прочитал эту статью!
у меня был запрос ... && ((A) || (B ||C) && (D || E)) а надо было писать ... && ((A) || ((B ||C) && (D || E))) или хотя бы ... && ((B ||C) && (D || E) || A) Последний раз редактировалось CHESER85; 28.08.2013 в 09:32. |
|
28.08.2013, 10:03 | #10 |
Участник
|
Кстати, в 2012-й никто не проверял как это работает ?
Неужели так и оставили. |
|
28.08.2013, 10:40 | #11 |
Участник
|
|
|
28.08.2013, 11:01 | #12 |
Участник
|
А я бы убрал.
Все равно X++ - экзотика. Все больше и больше кода пишется на .Net Для других программистов кто не знаком с X++ это подстава. Никто не ожидает такого поведения. Ну то есть если оставить то потенциальных ошибок будет больше чем если убрать. |
|
28.08.2013, 11:19 | #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 |
|
28.08.2013, 11:47 | #14 |
Участник
|
|
|
28.08.2013, 12:19 | #15 |
Участник
|
Глвное что бы при компиляции кода X++ в CIL приоритеты не менялись
В AX2012 с этим все в порядке? |
|
28.08.2013, 13:52 | #16 |
Участник
|
Они не могут меняться - приоритеты реализуются на уровне парсера, а он - тот же самый. Компиляция il использует байткод x++ в качестве входного языка, а не сам x++
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |