Новая версия платформы MetaTrader 4 build 1160 - страница 4

 
fxsaber :

Результат побитовой операции двух bool - int.

Igor Makanu :

потому что & это "Побитовая операция И"   https://www.mql5.com/ru/docs/basis/operations/bit

а Вам скорее всего нужно &&  https://www.mql5.com/ru/docs/basis/operations/bool

Я знаю.

Вопрос в том, почему есть разница между этими двумя строками?

 bool main()
   {
   bool result=func1()&func2();         // no warning...why ?    
   return func1()&func2();              // warning...it's ok 
   }

 bool func1()
   {
   Print ( "Function #1" );
   return false ;
   }

 bool func2()
   {
   Print ( "Function #2" );
   return false ;
   }
 
Alain Verleyen:

Я знаю.

Вопрос в том, почему есть разница между этими двумя строками?

Bitwise operations are performed with integers only.

bool result=func1()&func2();         // bool = int & int    
return func1()&func2();              // int & int != bool

try

return (bool)(func1()&func2());  
 
Alain Verleyen:

Я знаю.

Вопрос в том, почему есть разница между этими двумя строками?

Потому, что в первой строке есть явное присвоение типа логической операции к типу bool: bool result = func1()&func2();

Во второй же строке из функции с типом bool возвращается результат логической операции, а он не bool: bool main() { return func1()&func2(); }

 
Artyom Trishkin :

Потому, что в первой строке есть явное присвоение типа логической операции к типу bool : bool result = func1()&func2() ;

Во второй же строке из функции с типом bool возвращается результат логической операции , а он не bool: bool main() { return func1()&func2() ; }

@Ilyas

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

Во втором случае компилятор знает, что это bool, и он также выполняет неявное приведение, но добавляет предупреждение. Это не связно.

P.S: I don't know if the translation is correct, so I will wait Ilyas answer, no offense.

 
Alain Verleyen:

Во втором случае компилятор знает, что это bool, и он также выполняет неявное приведение, но добавляет предупреждение. Это не связно.

да, компилятор выполнит приведение типов при выполнении команды return()

но предупреждение и появляется именно по этому вопросу

вот Ваш код:

bool main()
   {
   bool result=func1()&func2();         // no warning...why ?    
   return func1()&func2();              // warning...it's ok 
   }

функция main() имеет тип bool , а результат который получается в return() имеет целый тип , попробуйте вот такой пример:

int main()
  {
   double result=func1()+func2();             
   return (func1()+func2());              // possible loss of data due to type conversion
  }
//+------------------------------------------------------------------+
double func1()
  {
   Print("Function #1");
   return (1.123);
  }
//+------------------------------------------------------------------+
double func2()
  {
   return(4.567);
  }
//+------------------------------------------------------------------+

в моем примере компилятор тоже напишет предупреждение, что возможна потеря данных.... у меня функция int main() , а результат в return() имеет тип double


https://docs.mql4.com/ru/basis/types/casting 

https://docs.mql4.com/en/basis/types/casting

Приведение типов - Типы данных - Основы языка - Справочник MQL4
Приведение типов - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Часто возникает необходимость преобразовать один числовой тип в другой. Не каждый числовой тип допустимо преобразовать в другой, допустимые преобразования в MQL4 показаны на схеме: Сплошные линии со стрелками обозначают преобразования, которые выполняются без потери информации. Вместо типа char может выступать тип bool (оба занимают в памяти 1...
Причина обращения: