Непонимание приведения типов

 
Код такой:


 
......(обычное описание советника. удалено)......
 
int func1()  
{
return(10);
}
 
....
 
 
int start()
 {
 
double d1;
 d1=func1();
 Print("func1()="+d1);
 d1=d1/100;
 Print("sim func1()/100="+d1);
 d1=func1()/100;
 Print("true func1()/100="+d1);
//----
 return(0);
 }




Результат:

11:12:01 xxx GBPUSD,H1: func1()=10.00000000
11:12:01 xxx GBPUSD,H1: sim func1()/100=0.10000000
11:12:01 xxx GBPUSD,H1: true func1()/100=0.00000000
 
Смени int func1() на double func1()
 
Vinin:
Смени int func1() на double func1()

Хорошая шутка. :)
 
И почему название темы изменили? Это Вы думаете,что именно я что-то не понимаю в приведении типов? :)
 
Player_2:
И почему название темы изменили? Это Вы думаете,что именно я что-то не понимаю в приведении типов? :)
Ваш код именно это и показывает - непонимание приведения типов. Разделили целочисленное 10 на целочисленное 100, получили законный ноль, а потом заявляете про БАГ.
 
MetaQuotes:
Player_2:
И почему название темы изменили? Это Вы думаете,что именно я что-то не понимаю в приведении типов? :)

Ваш код именно это и показывает - непонимание приведения типов. Разделили целочисленное 10 на целочисленное 100, получили законный ноль, а потом заявляете про БАГ.


Вы программист? Языками программирования владеете?.
Переменной d1 типа double я присваиваю выражение типа double (10/100=0. 1 - число типа double). Получаю результат, как будто переменная d1 имеет тип int, хотя она была объявлена как double.
 
Это была не шутка, а дружеский совет.
 
Vinin:
Это была не шутка, а дружеский совет.

Я здесь описываю баг, чтобы разработчики исправили его, а не ищу советов как его обойти. И вообще-то конкретно у меня баг имел несколько другую форму, я его здесь упростил, чтобы понятнее было в чём причина.
 
Vinin:
Это была не шутка, а дружеский совет.
A ему советы не нужны, ему бы лишь повыпендриваться...
 

Player_2, в чем проблема? Все правильно:

d1=func1()/100;

Вначале вычисляется выражение справа от знака равенства (о том, что слева, компилятор еще не знает), а потом результат (целое число, здесь равное нулю) преобразуется в то, что слева, т. е. в тип double. Ты, наверно, думал, что выражение справа вычисляется вот так:

(double) func1()/100;

 

Mathemat:

Player_2, в чем проблема? Все правильно:


d1=func1()/100;


Вначале вычисляется выражение справа от знака равенства (о том, что слева, компилятор еще не знает),  а потом результат (целое число, здесь равное нулю) преобразуется в тип того, что слева, т.е. double. Ты, наверно, думал, что выражение справа вычисляется вот так:


(double) func1()/100;



Аналогичный вопрос: языками программирования владеешь? В каком языке происходит также?

Из описания MQL :

Перед выполнением операций (кроме операций присваивания) происходит преобразование в тип, имеющий наибольший приоритет, а перед операциями присваивания - в целевой тип.

double d = 1 / 2.0; // выражение приводится к типу double, который совпадает с целевым типом, результат: 0.5


double d = 1 / 2; // выражение типа int приводится к целевому типу double, результат: 0.0

Хмм.. Действительно. Ты прав. Ну тогда вывод такой: в MQL не так как у людей.