Вопрос спецам по программированию. - страница 2

 

По мне - код всегда должен быть максимально прозрачным и ясным

Если есть малейшее сомнение в том, что написанное можно понять неоднозначно - то надо всемерно избегать таких конструкций. 

Одна из них, вот эта самая "if( X == Y == Z)".  Как тут верно написали, результат зависит от преобразований и принятого порядка операций, что далеко не всегда сразу видно.  

Лично на мой взгляд, даже оператор "вопросик" - недостаточно прозрачный. Эффективность его абсолютно такая же, как эффективность "обычного" if(), а вот с ясностью выполняемых действий - не всегда всё сразу ясно. 

По этой же причине - я считаю недопустимыми конструкции вроде 

(T *)((char *)(p++) + 3 * (--sizeof (T)))

Как правило, расписывание тех же громоздких выражений в несколько строк с ясными действиями в каждой - ничуть не уменьшает эффективность кода, однако, существенно улучшает понимание, что происходит на данном участке. 

В редких случаях, когда есть возможности разночтений, но изменённое написание заметно замедляет код - такой код должен быть подробно прокомментирован. 

 

Внимание: Приоритет выполнения операций в языке MQL5 соответствует приоритету, принятому в языке С++, и отличается от приоритета, заданного в языке MQL4.

<

<=

>

>=

Меньше, чем

Меньше или равно
Больше, чем
Больше или равно

Слева направо


Следовательно  if( X == Y == Z) читается так:

Если X равен Y — это уже булево значение равное 1 или true

Дальше — Если 1==Z будет соответственно 1 или true иначе 0 или false


Если же X не равен Y — значение 0 или false

Если 0==Z будет соответственно 1 или true иначе 0 или false

НО!!! Тут такой подвох, что false это 0, а всё остальное true, то всё зависит от значения и типа Z. 

А в общем-то да

Georgiy Merts #:

По мне - код всегда должен быть максимально прозрачным и ясным. 

Документация по MQL5: Основы языка / Операции и выражения / Приоритеты и порядок операций
Документация по MQL5: Основы языка / Операции и выражения / Приоритеты и порядок операций
  • www.mql5.com
Для каждой группы операций в таблице приоритет одинаков. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения...
 
Georgiy Merts #:
о мне - код всегда должен быть максимально прозрачным и ясным

Если бы это было так, не было бы обсфускаторов.
;)
 
Georgiy Merts #:
Лично на мой взгляд, даже оператор "вопросик" - недостаточно прозрачный. Эффективность его абсолютно такая же, как эффективность "обычного" if(), а вот с ясностью выполняемых действий - не всегда всё сразу ясно.

Есть хорошее правило - не использовать вложенные тернарные операторы. Если его придерживаться то будет не менее прозрачно, чем при использовании if. Visual studio для C# сразу ворнинг дает при попытке использовать вложенные тернарные операторы. Относительно часто упоминаю про C#, так как это, грубо говоря, единственное, с чем я могу сравнивать.

 
Georgiy Merts #:

Лично на мой взгляд, даже оператор "вопросик" - недостаточно прозрачный. Эффективность его абсолютно такая же, как эффективность "обычного" if(), а вот с ясностью выполняемых действий - не всегда всё сразу ясно. 

Ну с вопросиком несколько проще понимание, когда отделяешь одно от другого скобками. Т.е. скобки нужны в основном не программе, а программисту, чтобы поставил где-то курсор, левая и правая скобки подсветились и видно к чему относится то или иное условие...

К примеру, я вопросик использую для того, чтобы в одной строке условия сразу прописать условия и для бай, и для селл.

Говорят, что так практически никто не пишет, зато код получается наикратчайшим, с минимумом фигурных скобок и, в то же самое время, понятным для редактирования. 

А иначе приходится прописывать сначала все для бай, а потом то же самое для селл с небольшими изменениями... А также короткие вычисления влияют на скорость расчетов. Если в реальном времени это не заметно, то в тестере это очень заметно становится...

Ну теперь хоть стало понятно как читать if(X == Y == Z), т.е. по нормальному это читается как  if( (X==Y) == (bool)Z ) и никак иначе...

 
Dmitry Sumsky #:

Ну теперь хоть стало понятно как читать if(X == Y == Z), т.е. по нормальному это читается как  if( (X==Y) == Z) и никак иначе...

В определенных ситуациях возможность похожей записи полезна/удобна.

void OnStart()
{
  int a = 1;
  int b = a = 2;
}
 
fxsaber #:

В определенных ситуациях возможность похожей записи полезна/удобна.

Это совсем другое.

Это присваивание, где сначала в переменную A записывается значение 2, а потом в переменную B записывается значение переменной А.

И количество этих присваиваний не ограничено.

 
Dmitry Sumsky #:

Это совсем другое.

Написал же.
fxsaber #:

В определенных ситуациях возможность похожей записи полезна/удобна.

 
fxsaber #:
Написал же.
fxsaber #:
В определенных ситуациях возможность похожей записи полезна/удобна.

а они не похожие - они просто РАЗНЫЕ..

 
Maxim Kuznetsov #:

а они не похожие - они просто РАЗНЫЕ..

Занудство - оно такое.