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

 
alexvd:

Какие действия были до этого?

Обновление помогает?

 

Открыл терминал после нескольких дней неиспользования. Получил такую картину. Потом использовал скрипт подгрузить историю. Без изменений. Подождал пару часов. Теперь всё нормально. 

 
А не подскажете где можно узнать у кого МТ5 запущен на реале?
 
void OnStart()
  {
//---
   int x,y = 0;
   Print("x++:");
   x = x++;
   Print("x=",x," y=",y);
   y = x++;
   Print("x=",x," y=",y);
  }

Можете объяснить, почему по результатам прогона x==0, а y==1 ? Build 342

PS. Следует читать ... x==1, а y==0 ...

 
Ashes:

Можете объяснить, почему по результатам прогона x==0, а y==1 ? Build 342

 

Посмотри здесь https://www.mql5.com/ru/docs/basis/operations/mathoperation

Компилятор не выдвет ошибок или предупреждений? 

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Основы языка / Операции и выражения / Арифметические операции - Документация по MQL5
 
Ashes:

Можете объяснить, почему по результатам прогона x==0, а y==1 ? Build 342

 

Проверили, результат получается x=1, y=0

первый инкремент x=x++ раскладывается на

t=x;  // x=0
x++;  // x=1
x=t;  // x=0

 
Ashes:

Можете объяснить, почему по результатам прогона x==0, а y==1 ? Build 342

 

Можем. Всё дело в реализации x = x++;

Перед постинкрементом значение x сохраняется во временную переменную. Затем производится инкремент. Затем производится присвоение из временной переменной. 

 
Lizar:

Посмотри здесь https://www.mql5.com/ru/docs/basis/operations/mathoperation

Компилятор не выдвет ошибок или предупреждений? 

Компилятор MT5 проглатывает молча! В MT4 компиляция не проходит.

Из любопытства попробовал аналогичную конструкцию в С++ (из Visual Studio 2005) - там результат для x и y одинаковый.

 
Ashes:

Можете объяснить, почему по результатам прогона x==0, а y==1 ? Build 342

Нужно инициализировать переменные перед совершением с ними мат операций. Если сделать просто присвоение к неинициализированной переменной, то всё  будет нормально.

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

void OnStart()
  {
//---
   int x=0,y = 0;
   Print("x++:");
   x++;
   Print("x=",x," y=",y);
   y=x;
   Print("x=",x," y=",y);
  }
 
Ashes:

Компилятор MT5 проглатывает молча! В MT4 компиляция не проходит.

Из любопытства попробовал аналогичную конструкцию в С++ (из Visual Studio 2005) - там результат для x и y одинаковый.

В стандарте c++ это место не определено и явно сказано, что зависит от реализации. Существует 2 основные реализации:

1. Производить постинкремент(постдекремент) сразу после использования переменной в выражении. (как это сделано у нас)

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

 

Всмысле где можно узнать у каких брокеров МТ5 запущен на реале

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