AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.08.2007, 19:42   #1  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Логические операции в Х++
Сидел сегодня слушал презентацию
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 is offline
Dozer
Участник
AxAssist
Соотечественники
 
107 / 24 (1) +++
Регистрация: 16.11.2004
Адрес: г. Калгари, Канада
Хехе...
Майкрософт как всегда изобретает свой велосипед, не совместимый с другими.
Но я все равно буду всегда ставить скобки и считать что операция ИЛИ менее
приоритетна по отношению к И. Чтобы не лохануться потом в другом языке.
Мда. И теперь надобудет внимательнее смотреть что пишу в условиях в аксапте,
чтобы не получить неожиданное поведение только потому что не поставил где-то
скобки...
__________________
С уважением, Dozer

Последний раз редактировалось Dozer; 10.08.2007 в 19:56. Причина: Дополнение
Старый 10.08.2007, 21:58   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Dozer Посмотреть сообщение
Хехе...
Майкрософт как всегда изобретает свой велосипед, не совместимый с другими.
Эээ нее.
Тут Майкрософт винить не стоит.
Х++, со всеми плюсами и минусами, они взяли у Дамгаарда.
Поэтому если и боконули, то как раз датчане
Старый 10.08.2007, 22:21   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Эээ нее.
Тут Майкрософт винить не стоит.
Х++, со всеми плюсами и минусами, они взяли у Дамгаарда.
Поэтому если и боконули, то как раз датчане
А Дамгаард в свою очередь у Java.
Вот оно где корень проблемы
__________________
полезное на axForum, github, vk, coub.
Старый 10.08.2007, 22:25   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Сейчас залез в фолиант Еременко, Шашкова и уточнил по таблице на стр. 102. Так вот, логические операторы И и ИЛИ, т.е. двойные && и || , действительно имеют одинаковый приоритет. А вот бинарное И, т.е. одиночное &, имеет приоритет над бинарным ИЛИ, т.е. одиночным | . Видимо, отсюда некоторая путаница в умах... Честно говоря, не припомню, чтобы мне когда-либо приходилось в Аксапте применять бинарные операции.
Старый 10.08.2007, 22:28   #6  
vladz is offline
vladz
Участник
 
14 / 14 (1) ++
Регистрация: 26.01.2006
Вот что пишут об этой теме пишут в блоге X++ Compiler Developer Team:

http://blogs.msdn.com/x/archive/2007...ce-of-and.aspx
Старый 11.08.2007, 15:22   #7  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от kashperuk Посмотреть сообщение
И сделал для себя открытие (как приятно их все-таки делать )
Хмм.. Надеюсь, Вы все-таки прилежно расставляли скобки до этого открытия. Хотя бы из чистого консерватизма.
Старый 11.08.2007, 15:26   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от EVGL Посмотреть сообщение
Хмм.. Надеюсь, Вы все-таки прилежно расставляли скобки до этого открытия. Хотя бы из чистого консерватизма.
Прилежно
Я вообще очень "прилежный".
Старый 28.08.2013, 09:23   #9  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
эх блин, почему ж я раньше не прочитал эту статью!
у меня был запрос ... && ((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  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Кстати, в 2012-й никто не проверял как это работает ?
Неужели так и оставили.
Старый 28.08.2013, 10:40   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Logger Посмотреть сообщение
Кстати, в 2012-й никто не проверял как это работает ?
Неужели так и оставили.
Я бы оставил - если кто-то это использует, то куча кода сломается. Или надо вводить какие-то прагмы для указания конкретной версии синтаксиса для использование конкретном куске кода
Старый 28.08.2013, 11:01   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А я бы убрал.
Все равно X++ - экзотика. Все больше и больше кода пишется на .Net

Для других программистов кто не знаком с X++ это подстава. Никто не ожидает такого поведения.
Ну то есть если оставить то потенциальных ошибок будет больше чем если убрать.
Старый 28.08.2013, 11:19   #13  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
К сожалению, так и не добавили логический 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  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Logger Посмотреть сообщение
А я бы убрал.
Все равно X++ - экзотика. Все больше и больше кода пишется на .Net
Тогда надо убрать X++
Старый 28.08.2013, 12:19   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Глвное что бы при компиляции кода X++ в CIL приоритеты не менялись
В AX2012 с этим все в порядке?
Старый 28.08.2013, 13:52   #16  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Они не могут меняться - приоритеты реализуются на уровне парсера, а он - тот же самый. Компиляция il использует байткод x++ в качестве входного языка, а не сам x++
За это сообщение автора поблагодарили: S.Kuskov (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Параллельные операции в производственных маршрутах IvanHARD DAX: Функционал 40 02.04.2008 20:32
Параллельные операции в маршрутах Sanya DAX: Функционал 10 26.04.2007 00:41
Как для ГК операции в LedgerTrans найти соответствующую операцию в VendTrans? romulis DAX: Программирование 20 29.08.2006 14:10
Помогите указать 2 рабочих центра на операции clerk DAX: Функционал 14 08.02.2005 22:35
Строки спецификации - Код операции Андре DAX: Функционал 3 08.05.2003 14:27
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:31.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.