![]() |
#1 |
Участник
|
Делюсь опытом (вероятно с этим уже кто-либо сталкивался).
Ниже приведен код, в котором логическая формула E = a && (b || c && d) (в Axapta 3.0 Professional SP3) вопреки ожиданиям быть TRUE принимает значение FALSE. И только в таком исполнении E = a && (b || (c && d)) ожидания оправдываются. Очень мило, особенно если логика ветвистая и от нее зависит не видимость или невидимость кнопок, а, например, количество и содержание проводок по мудреной операции. Самое главное - не мудрить! А также не надеяться на фундаментальные правила. Код: static void Job106(Args _args) { boolean a, b, c, d, E; a = true; b = true; c = false; d = false; E = a && (b || c && d); print a; print b; print c; print d; print E; pause; } |
|
![]() |
#2 |
Участник
|
I am wondering why you think it is strange. Axapta just executes them in the order, and because '&&' and '||' are basically equal, they get executed like this:
1. B || C returns 'true' 2. 'true' && D returns 'false', because D is false 3. A && 'false' returns false. As a good practice we always are trying to reinforce the expected order of operations with parenteses. |
|
![]() |
#3 |
Участник
|
Нет возражений, однако это первый язык в моей практике, в котором операции OR и AND имеют один и тот же приоритет.
|
|
![]() |
#4 |
Участник
|
к сожалению, это так..
Microsoft Axapta Developer's Guide \ Operators and Expressions \ Operator precedence Цитата:
logical operators (AND, OR)
&& and || In X++, && (logical AND) and || (logical OR) have the same precedence and are evaluated from left to right. This means that 0&&0||1 == 1 while 1||0&&0 == 0 |
|
![]() |
#5 |
Участник
|
это тоже самое что и с++
|
|