Ошибка компилятора?

 

Когда мучал код советника Тестором, обнаружил, что операция =+ выполняется неправильно.

Ниже приведен соответствующий фрагмент кода:

int index;
double sum;
  
int init(){index = 0; sum = 0.0; return(0);}
int deinit(){return(0);}
 
int start()
{
   
   sum =+ Bid;          // вариант 1
   //sum = sum + Bid;     // вариант 2
   index++;
   
   if(index > 5) return(0);
   
   Print(TimeToStr(Time[0]), "  sum=", sum, "  Bid=", Bid);
   
   return(0);
}



Если его прогнать через Тестер, то в Журнале можно увидеть следующее:

2006.11.19 07:53:23 2006.11.08 00:01 Bug GBPUSD,M15: 2006.11.08 00:00 sum=1. 9069 Bid=1.9069
2006.11.19 07:53:23 2006.11.08 00:01 Bug GBPUSD,M15: 2006.11.08 00:00 sum=1. 9072 Bid=1.9072
2006.11.19 07:53:23 2006.11.08 00:00 Bug GBPUSD,M15: 2006.11.08 00:00 sum=1. 9073 Bid=1.9073
2006.11.19 07:53:23 2006.11.08 00:00 Bug GBPUSD,M15: 2006.11.08 00:00 sum=1. 9071 Bid=1.9071
2006.11.19 07:53:23 2006.11.08 00:00 Bug GBPUSD,M15: 2006.11.08 00:00 sum=1. 9071 Bid=1.9071
2006.11.19 07:53:23 Bug started for testing
2006.11.19 07:53:23 Bug GBPUSD,M15: loaded successfully

- что не есть хорошо

Если прогнать второй вариант, то все в порядке:

2006.11.19 08:04:59 2006.11.08 00:01 Bug GBPUSD,M15: 2006.11.08 00:00 sum=9. 5356 Bid=1.9069
2006.11.19 08:04:59 2006.11.08 00:01 Bug GBPUSD,M15: 2006.11.08 00:00 sum=7. 6287 Bid=1.9072
2006.11.19 08:04:59 2006.11.08 00:00 Bug GBPUSD,M15: 2006.11.08 00:00 sum=5. 7215 Bid=1.9073
2006.11.19 08:04:59 2006.11.08 00:00 Bug GBPUSD,M15: 2006.11.08 00:00 sum=3. 8142 Bid=1.9071
2006.11.19 08:04:59 2006.11.08 00:00 Bug GBPUSD,M15: 2006.11.08 00:00 sum=1. 9071 Bid=1.9071
2006.11.19 08:04:59 Bug started for testing
2006.11.19 08:04:59 Bug GBPUSD,M15: loaded successfully

Ну и на всякий случай -
Build 200
Символ: GPBUSD Период: М15
Модель: Все тики
Использовать дату: от 2006.11.08 до 2006.11.09

 
Все верно. Вы перепутали операцию. Надо использовать += , а не =+

Из документации:

Следующие операции объединяют арифметические или побитовые операции с операцией присваивания:

Увеличение значения переменной у на x                  у += x;
Уменьшение значения переменной y на x y -= x;
Умножение значения переменной y на x y *= x;
Деление значения переменной y на x y /= x;
Остаток от деления значения переменной y на x y %= x;
Сдвиг двоичного представления y вправо на x бит y >>= x;
Сдвиг двоичного представления y влево на x бит y <<= x;
Побитовая операция И двоичных представлений y и x y &= x;
Побитовая операция ИЛИ двоичных представлений y и x y |= x;
Побитовая операция исключающее ИЛИ
двоичных представлений y и x y ^= x;
 
Renat писал (а):
Все верно. Вы перепутали операцию. Надо использовать += , а не =+

Из документации:

Следующие операции объединяют арифметические или побитовые операции с операцией присваивания:

Увеличение значения переменной у на x                  у += x;
Уменьшение значения переменной y на x y -= x;
Умножение значения переменной y на x y *= x;
Деление значения переменной y на x y /= x;
Остаток от деления значения переменной y на x y %= x;
Сдвиг двоичного представления y вправо на x бит y >>= x;
Сдвиг двоичного представления y влево на x бит y <<= x;
Побитовая операция И двоичных представлений y и x y &= x;
Побитовая операция ИЛИ двоичных представлений y и x y |= x;
Побитовая операция исключающее ИЛИ
двоичных представлений y и x y ^= x;



Спасибо! Это была моя дурацкая ошибка, но компилятор не отловил неправильную операцию и не выдал код ошибки! Хотя операция =+ может существовать, если компилятор считает, что + это унитарная операция изменения знака для переменной Bid. Но было бы лучше, если бы компилятор отлавливал сочетание =+ как ошибочное
 
В С операция =+ определена, существует и называется "постинкремент". Поскольку компилятор MQL4 - близкий родственник сишного, наверно, потому и не заметил.
 
alexjou:
В С операция =+ определена, существует и называется "постинкремент". Поскольку компилятор MQL4 - близкий родственник сишного, наверно, потому и не заметил.
Нет, не правильно ...

В С есть два варианта ++а и а++
Вот второй наверное можно назвать "постинкремент"
В MQL4 только один вариант.

А sum =+ Bid полностью эквивалентно выражению sum = +Bid;
Которое наверное ни у кого сомнений не вызывает.
 
Пардон, перепутал. :(((
 
sum=+Bid <===> sum=Bid      simple assignment
Причина обращения: