12.11.2010, 13:20 | #1 |
Участник
|
Ax2009 RU5: класс InventDimCtrl_Frm_Mov_Purch
Есть в этом классе метод mustEnableField().
Заинтересовал следующий участок кода X++: && (movement.interCompanyMovement() && this.dimSearch().dimFinancialInvent() || movement.interCompanyTransaction() && this.dimSearch().dimItemDimension())) Создатели пропустили скобки или так и должно быть ? Аналогичная ситуация и в классе InventDimCtrl_Frm_Mov_Sales.
__________________
Дмитрий |
|
|
За это сообщение автора поблагодарили: samolalex (1). |
12.11.2010, 13:44 | #2 |
Участник
|
Все правильно, последняя скобка относится ко всему IF.
|
|
12.11.2010, 13:46 | #3 |
Участник
|
На сколько я помню приоритет операции ||(ИЛИ) ниже приоритета операции &&(И). Так что конкретно в данном случае скобки не обязательну.
Друго дело что страдет наглядность кода и повышается вероятность ошибки при возможных изменениях этого участка кода - это да. |
|
12.11.2010, 13:49 | #4 |
Участник
|
Применительно ко всему условию скобки расставлены правильно. Все условие выглядит примерно так:
if(x && y && q && ( a && b || c && d ) ) В чем проблема, не могу понять? |
|
12.11.2010, 14:00 | #5 |
Участник
|
Как я понял, вопрос состоит в уточнении приоритетности операций && и ||.
( a && b || c && d ) равносильно ( (a && b) || (c && d) ), но ( a && b || c && d ) не равносильно ( a && (b || c) && d )
__________________
С уважением, Александр. |
|
12.11.2010, 15:26 | #6 |
Участник
|
Да, вопрос в приоритетности операций.
По тому как на самом деле отрабатывает метод у меня возникло убеждение что операция ИЛИ для системы в данном конкретном случае имеет больший приоритет чем операция И. То есть в данном случае (a && b || c && d) отрабатывает как (a && ( b || c ) && d) Может приоритет логических операций где-то настраивается ?
__________________
Дмитрий |
|
12.11.2010, 15:29 | #7 |
Участник
|
Цитата:
Может приоритет логических операций где-то настраивается ?
__________________
С уважением, Александр. |
|
12.11.2010, 15:37 | #8 |
Участник
|
Нет, абсурд. Такой настройки существовать не может. Иначе, как обеспечить совместимость раличных модификаций!
Можете набросать тестовый джобик? А лучше сами ещё повнимательнее всё проверьте. |
|
12.11.2010, 15:55 | #9 |
Участник
|
Приоритет операций описан в спецификации языка. Он не менялся и не может меняться. Скорее всего вы что-то не правильно поняли.
|
|
12.11.2010, 15:56 | #10 |
Участник
|
Цитата:
Указанный мною метод класса InventDimCtrl_Frm_Mov_Purch определяет доступность номенклатурных и складских аналитик в закупках. Если предположить что логическое И имеет превосходство над ИЛИ, то исходя из этого метода финансовые складские аналитики должны быть недоступны для редактирования в открытых строках внутрирасчётных закупок. Хотя я у нас в системе вижу обратное. Это говорит о том что сначала всё-таки выполняется логическое ИЛИ, а потом И. Даже ставил точку останова чтобы убедиться в этом.
__________________
Дмитрий |
|
12.11.2010, 16:02 | #11 |
Участник
|
стоило только облачить операции с логическим И в скобки (хотя это вроде бы и не должно ни на что повлиять)
X++: && ((movement.interCompanyMovement() && this.dimSearch().dimFinancialInvent()) || (movement.interCompanyTransaction() && this.dimSearch().dimItemDimension())))
__________________
Дмитрий |
|
12.11.2010, 16:05 | #12 |
Участник
|
А вы можете взять другое приложение, провести на нем глобальную компиляцию и проверить?
|
|
12.11.2010, 16:11 | #13 |
Участник
|
Проверил у себя на приложении - все нормально. Может вы внутри этих проверок уже что-то накосячили?
|
|
12.11.2010, 16:46 | #14 |
Модератор
|
А если открыть SDK и почитать о Operator Precedence?
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: Damn (2). |
12.11.2010, 16:50 | #15 |
Участник
|
Цитата:
Цитата:
Даже не нужно новое приложение, просто уберите скобки обратно. Проверьте ошибка вернулась? |
|
12.11.2010, 17:16 | #16 |
Участник
|
Вот спасибо за предложение почитать
Issues concerning X++: Operator precedence of && and || In X++ these two operators have the same precedence, whereas in other languages && is higher priority than || Теперь про приоритет логических операций в X++ мне всё понятно, остался вопрос с этим методом - всё-таки программисты забыли скобки поставить или осознанно не поставили ?
__________________
Дмитрий |
|
|
За это сообщение автора поблагодарили: S.Kuskov (3). |
12.11.2010, 17:36 | #17 |
Участник
|
Думаю осознанно. Теоретически ведь ошибки нет.
|
|
12.11.2010, 17:44 | #18 |
Участник
|
|
|
12.11.2010, 17:45 | #19 |
Участник
|
брр.. вы уверены, что это (a && b || c && d ) не эквивалентно ((a && b) || (c && d )) ?
|
|
12.11.2010, 18:43 | #20 |
Участник
|
Цитата:
например как (a+b-c+d) эквивалентно (((a+b)-c)+d) P.S.: Тема 2007-го года Логические операции в Х++ Последний раз редактировалось S.Kuskov; 12.11.2010 в 19:06. |
|
|
|