Как понять это выражение

 
Не могу понять вот это вот выражение

if(!StopLoss==0)  


 
Вообще-то лучше бы написать
if(StopLoss!=0)
это более читабельно и логично выглядит.
Хотя по сути результат будет тот же.
 
Simca:
Вообще-то лучше бы написать
if(StopLoss!=0)
это более читабельно и логично выглядит.
Хотя по сути результат будет тот же.
Спасибо
 
Да, причём судя по справке в MetaEditor, первое выражение неверное.
Порядок операций таков:

Для каждой группы операций в таблице приоритет одинаков. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения определяет группировку операций и операндов.

()     Вызов функции                            Слева направо
[]     Выделение элемента массива
!      Логическое отрицание                     Справа налево
-      Изменение знака
++     Увеличение на единицу (increment)
--     Уменьшение на единицу (decrement)
~      Побитовое отрицание (complement)
&      Побитовая операция И                     Слева направо
|      Побитовая операция ИЛИ
^      Побитовая операция исключающее ИЛИ (eXclude OR)
<<     Сдвиг влево
>>     Сдвиг вправо
*      Умножение                                Слева направо
/      Деление
%      Деление по модулю
+      Сложение                                 Слева направо
-      Вычитание
<      Меньше, чем                              Слева направо
<=     Меньше или равно
>      Больше, чем
>=     Больше или равно
==     Равно
!=     Не равно


Т.е. с начала выполнится унарная операция !, у которой приоритет на 4 порядка выше, применительно к переменной StopLoss, что выйдёт из логического отрицания целого числа, сказать трудно, вероятно, сравнение 0/не 0, это же не побитовое отрицание ~. А затем к этому непонятному результату будет применено сравнение с нулем == 0. В итоге может получиться полный бред.

Отсуда правило кодирования - всегда ставьте скобки для полной определённости, даже если чувствуете себя полным гением создания запутанных выражений.
Или поменяйте выражение на однозначно понимаемое, что и предложили в итоге.
 
Я так и понял, что полная несуразица. Долго голову ломал
 
chv:
Да, причём судя по справке в MetaEditor, первое выражение неверное.
Еще раз повторю, результат обоих операций ИДЕНТИЧЕН.
Как я и писал, операция вида :
if(!StopLoss==0)
визуально выглядит криво, поэтому лучше пользоваться операцией:
if(StopLoss!=0)
она более читабельна, логична и понятна.
Хотя, повторюсь, по сути результат будет тот же.

Вот пример кода подтверждающий что результат совпадает для разных типов данных (целых и вещественных):
void start()
  {
   int    A=0;      bool A1=(!A==0); bool A2=(A!=0);
   int    B=200;    bool B1=(!B==0); bool B2=(B!=0);
   double C=0.0;    bool C1=(!C==0); bool C2=(C!=0);
   double D=1.2345; bool D1=(!D==0); bool D2=(D!=0);
   Comment("A: ",A," не равно 0 - Вар.1=",A1,"  Вар.2=",A2,"n",
           "B: ",B," не равно 0 - Вар.1=",B1,"  Вар.2=",B2,"n",
           "C: ",C," не равно 0 - Вар.1=",C1,"  Вар.2=",C2,"n",
           "D: ",D," не равно 0 - Вар.1=",D1,"  Вар.2=",D2,"n");
  }
Запустите этого эксперта и убедитесь что получаются идентичные значения 0 и 1, соответствующие логическим False и True.
 
В школе есть такая шутка: "сколько будет два плюс два умножить на два". Т.е. выражение 2+2*2.
С ходу отвечают на слух 8, выполняя действия по порядку звучания, хотя это неверно. Порядок операций другой, верный ответ равен 6-ти.

Правильно первое выражение темы нужно писать так: if(!(StopLoss==0)).Со скобками.
В этом случае порядок выполнения операций верный, т.е. совпадающий с логикой. А то, что результаты вышли те же, чистая случайность. Не надо на неё полагаться.
Самы лучший вариант, конечно: if(StopLoss!=0).
 
chv:
В школе есть такая шутка: "сколько будет два плюс два умножить на два". Т.е. выражение 2+2*2.
С ходу отвечают на слух 8, выполняя действия по порядку звучания, хотя это неверно. Порядок операций другой, верный ответ равен 6-ти.

Правильно первое выражение темы нужно писать так: if(!(StopLoss==0)).Со скобками.
В этом случае порядок выполнения операций верный, т.е. совпадающий с логикой. А то, что результаты вышли те же, чистая случайность. Не надо на неё полагаться.
Самы лучший вариант, конечно: if(StopLoss!=0).



Ты прав это выражение if(!(StopLoss==0)) вполне логичное и сразу однозначно понимаемое. Легче самому написать, чем понять смысл изощрений
иных писателей.
Всё таки логика должна оставаться логикой - элементарной, однозначной и не вызывать сомнений
 
Еще вариант - StopLoss==!0
 
Integer писал (а):
Еще вариант - StopLoss==!0
Неправильный вариант, так как не 0 - это логическое выражение, возвращающее TRUE, то есть целое число 1, а StopLoss - переменная типа double. Выражение будет истинно только в том случае, когда StopLoss==1.0

А вот не StopLoss возвращает либо FALSE (0), либо TRUE (1)
 

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

Причина обращения: