восклицательный знак

 

Помогите разобраться. Встретил такую запись: if(!StopLoss==0)

Непонятно назначение восклицательного знака. Опечатка, наверно? Или это равнозначно if(StopLoss != 0)

Далее, по тексту аналогичный восклицательный знак:

if(!OrderSelect( z,SELECT_BY_POS,MODE_HISTORY))

Такой же вопрос.

 
if(!StopLoss==0) некорректно, лучше if(StopLoss != 0).

if(!OrderSelect( z,SELECT_BY_POS,MODE_HISTORY)) - краткая форма записи if(OrderSelect( z,SELECT_BY_POS,MODE_HISTORY) == false); то же самое:
if(OrderSelect( z,SELECT_BY_POS,MODE_HISTORY) != true)

 

Спасибо, понял. А то, было желание стереть "лишний" восклицательный знак :)

 
Ну вариант if(!StopLoss==0) действительно выглядит не очень (хотя формально некорректным не является), и в данном случае if(StopLoss!=0) смотрится предпочтительнее.
Потому как в этом сравнении числа участвуют, лучше из как числа и сравнивать.

А вот сравнивать логику на ==false или !=true мне лично не нравится. Предпочитаю if(!OrderSelect( ... )). Потому как логика и работает как логика.
Хотя конечно все это дело вкуса.
 
Makarov писал (а):

Помогите разобраться. Встретил такую запись: if(!StopLoss==0)

Будьте внимательны !
if(StopLoss!=0) - будет корректно работать только если StopLoss - integer или bool.
 
ForexFox:
Makarov:

Помогите разобраться. Встретил такую запись: if(!StopLoss==0)

Будьте внимательны !
if(StopLoss!=0) - будет корректно работать только если StopLoss - integer или bool.
Ну вообще-то Вы не совсем правы. Вот пример:
void start()
  {
   double StopLoss=0.0;
   if(StopLoss!=0) Comment("StopLoss=",StopLoss," - StopLoss не равно нулю...");
   else Comment("StopLoss=",StopLoss," - StopLoss равно нулю!!!");
  }
Сравнение работает вполне корректно (можете проверить) ибо константа изначально нормализована.
Можно даже вот такой вариант проверить:
void start()
  {
   double StopLoss=1/333;
   if(StopLoss!=0) Comment("StopLoss=",StopLoss," - StopLoss не равно нулю...");
   else Comment("StopLoss=",StopLoss," - StopLoss равно нулю!!!");
  }
Опять получаем корректное равенство нулю, ибо при целочисленном делении получаем целочисленный результат, который при сохранении в переменной типа double будет нормализованным.
Можно даже привести пример с вещественным делением:
void start()
  {
   double StopLoss=NormalizeDouble(1/55555.55,4);
   if(StopLoss!=0) Comment("StopLoss=",StopLoss," - StopLoss не равно нулю...");
   else Comment("StopLoss=",StopLoss," - StopLoss равно нулю!!!");
  }
Как видите опять все корректно, ибо результат операции явно нормализован до нужного количества знаков (специально указал не 0 знаков а 4, но при нормализации до этого числа знаков в результате получается 0).

Так что использовать подобное сравнение можно, но надо быть уверенным что переменная типа double участвующая в сравнении предварительно нормализована!!!

Ну а в общем случае естественно лучше переменные типа double на точное совпадение без нормализации не сравнивать. Об этом уже не раз говорили.
 
Simca писал (а):

Ну вообще-то Вы не совсем правы. Вот пример:

Я прекрасно понимаю, что Вы имеете ввиду, когда говорите, что я не совсем прав. Добавлю к своему сообщению, что переменные типа double никогда нельзя сравнивать строго, только > или <. И эти слова я пишу для Makarov.

Я не сомневаюсь в Ваших знаниях по поводу данного вопроса, но
Ваши примеры не корректны т.к. переменная StopLoss в них по-сути является константой ! Более того они опасны для новичков. Новички должны себе строго усвоить как сравниваются переменные.

С Уважением !
 
ForexFox писал (а):
...
Добавлю к своему сообщению, что переменные типа double никогда нельзя сравнивать строго, только > или <.
...
Совершенно согласен - натыкался неоднократно!
Даже выражение: double SL = MaxStop*Point; иногда вызывает сообщение терминала неправильный стоп-лосс! Казалось бы, ан нет сравнивать строго можно только нормализованные числа и то очень аккуратно.

Но вот еще что интересно. Мне кажется выражения !StopLoss==0 и StopLoss != 0 по разному обрабатываются из-за приоритета операций. Насколько я помню, операция отрицания (!) имеет самый высокий приоритет и выполняется до операции сравнения.
Таким образом выражение !StopLoss==0 эквивалентно выражению (!StopLoss) == 0.
Причина обращения: