Логические вычисления, как параметр функции.

 
Случайно обнаружил, что вот эта конструкция работает:

bool a, b;
void Function (bool abc) {return;}
//====
Function (a || b);


Проверка происходит на истину.
Это создателями MQL4 специально предусмотрено?
 
Zhunko:
Случайно обнаружил, что вот эта конструкция работает:

bool a, b;
void Function (bool abc) {return;}
//====
Function (a || b);


Проверка происходит на истину.
Это создателями MQL4 специально предусмотрено?


очень лаконично написано. :-) чую, что автор чем-то удивлён, хочу удивиться сам, но туплю..

а почему вычисления (любые) нельзя использовать при вызове функции как параметр? вроде, всегда используем..

 
Zhunko:
Случайно обнаружил, что вот эта конструкция работает:

bool a, b;
void Function (bool abc) {return;}
//====
Function (a || b);


Проверка происходит на истину.
Это создателями MQL4 специально предусмотрено?
Вадим привет!
это обычная конструкция, во многих языках именно так и работает
 
Если это используется, то давайте пойдём дальше?
Может задавать любые условия, как параметр функции. Не только на истину.
Т.е. если арифметические выражения возможны любые, как параметр функции, то почему такое ограничение на логические вычисления?
 
Где вы увидели ограничение?
 
bstone:
Где вы увидели ограничение?
Проверка происходит только на истину.
 
Где вы вообще в вашем коде увидели проверку? И почему только на истину? Вот берем аналогичный вашему код:

void foo( bool arg )
{
    Print( "arg=" + arg );
}    
 
int init()
{
    bool a = false;
    bool b = false;
    foo( a || b );
    
    return(0);
}
После запуска видим в журнале:

2008.03.04 20:39:24 2007.01.02 08:00 prb EURUSD,M1: arg=0

Функция вызвается нормально, хотя результат логического выражения false.

Может у вас экзотические представления о программировании в целом?
 
bstone:
Может у вас экзотические представления о программировании в целом?
Да. Они эзотерические у меня в целом...
Вы попробуйте в Вашем примере присвоить разные значения "a" и  "b". После посмотрите, что вернёт эта функция.
Потом попробуйте заменить "ИЛИ" на "И". Повторите ещё раз эксперемент.
Я не проверял Вашу функцию ещё. Времени нет на неё, но в моей при выборе во внутрь функции попадает только ИСТИНА.
 
Ясно, значит чепуху писать время есть, а проверить сначала то, что пишем - нет.

Вот вам полный факторный перебор комбинаций значений:

void foo( bool arg )
{
    Print( "arg=" + arg );
}    
 
int init()
{
    bool a = false;
    bool b = false;
    foo( a || b );
    
    a = true;
    b = false;
    foo( a || b );
 
    a = false;
    b = true;
    foo( a || b );
 
    a = true;
    b = true;
    foo( a || b );
 
    a = false;
    b = false;
    foo( a && b );
 
    a = false;
    b = true;
    foo( a && b );
 
    a = true;
    b = false;
    foo( a && b );
 
    a = true;
    b = true;
    foo( a && b );
 
    return(0);
}
А вот результат:

2008.03.05 01:25:33 prb EURUSD,M1: loaded successfully
2008.03.05 01:25:34 prb started for testing
2008.03.05 01:25:34 2007.01.02 08:00 prb EURUSD,M1: arg=0
2008.03.05 01:25:34 2007.01.02 08:00 prb EURUSD,M1: arg=1
2008.03.05 01:25:34 2007.01.02 08:00 prb EURUSD,M1: arg=1
2008.03.05 01:25:34 2007.01.02 08:00 prb EURUSD,M1: arg=1
2008.03.05 01:25:34 2007.01.02 08:00 prb EURUSD,M1: arg=0
2008.03.05 01:25:34 2007.01.02 08:00 prb EURUSD,M1: arg=0
2008.03.05 01:25:34 2007.01.02 08:00 prb EURUSD,M1: arg=0
2008.03.05 01:25:34 2007.01.02 08:00 prb EURUSD,M1: arg=1
Если у вас еще остались какие-либо сомнения, то самое время почитать что-нибудь об основах булевой алгебры.
 
Zhunko:

Я не проверял Вашу функцию ещё. Времени нет на неё, но в моей при выборе во внутрь функции попадает только ИСТИНА.

Где-то у Вас ошибка в коде. Вот проверочный скрипт Вашего примера:

//+------------------------------------------------------------------+
//|                                          CheckBoolInFunction.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
 
bool a, b;
 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Function (bool abc) 
   {
//----
   Print("true=",true,"  false=",false);
   Print("abc=",abc);
//----
   return;
   }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   Function (a || b);   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Запускаем и получаем:


Как видите, внутрь функции попадает значение false, как и должно быть.
 
Спасибо! Уже понял в чём дело. Запутался в условиях.
По моему, по условию "ИЛИ" должны были проходить обе переменные. Нот здесь это выражение расчитывается до конца.
Т.е. ИСТИНА ИЛИ ЛОЖЬ = ИСТИНА.
Причина обращения: