Ошибки, баги, вопросы - страница 3611

 
Alain Verleyen #:
Вы НЕ МОЖЕТЕ полагаться на порядок выполнения или на то, как компилятор будет оценивать операнды.

Надеюсь, что оценка операндов в логических операциях всегда слева направо. Если это так, то это только благодаря brief estimate?

Очень распространенные примеры инициализации чего-то, где порядок оценки операндов критически важен:

bool a();
bool b();
bool c();
void doSomething();

bool initialize1()
  {
   return(a() && b() && c());
  }

bool initialize2()
  {
   if(!a() || !b())
      return(false);
   doSomething();
   return(c());
  }

void OnStart() {}
 
Vladislav Boyko #:
Очень распространенные примеры инициализации чего-то, где порядок оценки операндов критически важен:

Из того примера не очевидно, что порядок оценки операндов критически важен. Вот другой пример:

class A
  {
public:
   bool initialize();
   int get();
  };

class B
  {
public:
   bool initialize(int a);
   int get();
  };

class C
  {
public:
   bool initialize(int a, int b);
  };

bool f()
  {
   A a;
   B b;
   C c;
   // .get() should not be called before .initialize()
   return(a.initialize() && b.initialize(a.get()) && c.initialize(a.get(), b.get()));
  }
 
Vladislav Boyko # :

Надеюсь, что оценка операндов в логических операциях всегда слева направо. Если это так, то это только благодаря  brief estimate?

Очень распространенные примеры инициализации чего-то, где порядок оценки операндов критически важен:

Конечно, речь шла об арифметических операторах, а не о логических.
 

Интересно, почему для C#  Microsoft разделяет [Logical AND operator &, Logical OR operator |, Logical exclusive OR operator ^] и bitwise версии этих операторов. При этом их C++ reference говорит только про bitwise версии (как и документация по MQL). Я слаб в побитовой арифметике. Logical и bitwise версии это одно и то же или нет? Будут ли в MQL побитовые операторы примененные к bool операндам работать так же, как это описывается по ссылкам, которые я привел?

 
Alexey Viktorov #:

Видимо я не смогу объяснить так, чтобы было понятно…

Вот смотри… Казалось бы переменной уже присвоено новое значение, ан нет, пока ещё j равна 2



Именно в этой иллюстрации явный баг. Переменная уже должна быть инициализирована новым значением, но отладчик отображает предыдущее.
 
Vladislav Boyko #:
Logical и bitwise версии это одно и то же или нет?

Совсем нет. Побитовые - это когда идёт работа с машинным представлением числа(или символа, ...) как с набором битовых флагов. В первом приближении это можно представить как структуры булевых переменных и логические операции над такими структурами.

 
Sergey Gridnev #:

Именно в этой иллюстрации явный баг. Переменная уже должна быть инициализирована новым значением, но отладчик отображает предыдущее.

А тут вариантов только два. Или разработчики исправят, или надо помнить о таких вариантах и не пытаться применять всяческие извращения которые зачастую приводят к непредсказуемому результату.

 
JRandomTrader #:

Совсем нет. Побитовые - это когда идёт работа с машинным представлением числа(или символа, ...) как с набором битовых флагов. В первом приближении это можно представить как структуры булевых переменных и логические операции над такими структурами.

То есть, вот это и вот это - разные вещи, я правильно понимаю?

 
Vladislav Boyko #:

То есть, вот это и вот это - разные вещи, я правильно понимаю?

Там же видно, что разные. Но да, как-то не по-людски там сделано.

 
Vladislav Boyko #:

То есть, вот это и вот это - разные вещи, я правильно понимаю?

Просто, если операнды булевы, то их значения: 0 или 1. Результаты логических операций | и & с такими операндами тоже 0 или 1, они преобразуются в булевы "ложь" и "истина". А сами операции по ссылкам одинаковы.