Características del lenguaje mql5, sutilezas y técnicas - página 202

 
Los comentarios no relacionados con este tema han sido trasladados a "Preguntas de los principiantes de MQL5 MT5 MetaTrader 5".
 

Las funciones estándar reciben los argumentos de izquierda a derecha.

Las funciones personalizadas reciben los argumentos de derecha a izquierda.

double f1()
{
  Print(__FUNCSIG__);
  
  return(0);
}

double f2()
{
  Print(__FUNCSIG__);
  
  return(0);
}

void Func( double, double )
{
}

#define  PRINT(A) Print(#A);  A

void OnStart()
{  
  PRINT(MathMin(f1(), f2()));
  
  PRINT(Func(f1(), f2()));
}


Resultado.

        MathMin(f1(),f2())
        double f1()
        double f2()
        Func(f1(),f2())
        double f2()
        double f1()


¿Es así como debe ser?

 
fxsaber:

¿Es así como debe ser?

Se trata de un LU en el que no se puede confiar. Es decir, hay que evitar explícitamente las situaciones en las que la lógica de un programa depende del orden en que se evalúan los argumentos

 
fxsaber:

Las funciones del personal reciben los argumentos de izquierda a derecha.

He aquí un ejemplo de refutación:

string f1() { Print(1); return NULL; }
string f2() { Print(2); return NULL; }
void OnStart()
{
    StringCompare(f1(), f2());
}

Resultado: 2 1

 
Andrei Trukhanovich:

Se trata de un LU en el que no se puede confiar. Es decir, debemos evitar explícitamente las situaciones en las que la lógica de un programa depende del orden en que se evalúan los argumentos

A100:

He aquí un ejemplo de refutación:

Resulta que todo es inestable con las personalizadas. Con las personalizadas, todo es inestable desde el principio.

 
fxsaber:

Resulta que todo es inestable con los estándar. Con las personalizadas, es inequívoco desde el principio.

La diferencia es que hay funciones regulares (de derecha a izquierda) y funciones inline (orden indefinido).

las funciones inline no son funciones en absoluto, es decir, no pueden tener una dirección. Desde este punto de vista, no hay diferencia entre las funciones regulares y las personalizadas, así que, por ejemplo, no está claro por qué los argumentos de la función personalizada más sencilla (que en esencia es inline) se calculan siempre de derecha a izquierda. No excluyo que en el futuro para las funciones en línea el orden pueda cambiar, así que

En su día sugerí introducir una palabra clave inline para el uso seguro del orden de los cálculos:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Errores, fallos, preguntas

A100, 2017.10.05 14:30

Esto demuestra una vez más la utilidad de la palabra clave inline de C++ (aquí se opinaba que estaba supuestamente obsoleta).
Entre otras cosas, inline significa en realidad que el programador no utiliza el orden de cálculo de los parámetros de la función y si el compilador decide que la función inline sea inline, entonces el compilador puede utilizar el orden de cálculo hacia delante como más eficiente (el orden de cálculo inverso es obviamente sólo eficiente para las funciones llamadas).
Al mismo tiempo, si el compilador decide incrustar una función no inline, debería utilizar el orden inverso (general) de evaluación, aunque esto conlleve una pérdida de eficiencia (porque el programador asumió este orden sin haber declarado la función inline)

inline también sería apropiado en MQL, donde el orden de cálculo no puede ser controlado explícitamente


 
A100:

La diferencia es que hay funciones normales (de derecha a izquierda) y funciones inline (orden indefinido).

Las funciones en línea no son funciones en absoluto, es decir, no pueden tener una dirección. Desde este punto de vista, no hay diferencia entre las funciones regulares y las personalizadas, así que, por ejemplo, no está claro por qué los argumentos de la función personalizada más sencilla (que en esencia es inline) se calculan siempre de derecha a izquierda. No excluyo que en el futuro para las funciones en línea el orden pueda cambiar, así que

En su día sugerí introducir una palabra clave inline para el uso seguro de la orden de cálculo:

Gracias por la aclaración, no había pensado en el inline.

__forceinline void Func( double, double )

Esta opción no afecta al resultado.

 
fxsaber:

Gracias por la aclaración, no había pensado en el inline.

Esta opción no afecta al resultado.

No tiene efecto ahora, porque no existe en MQL

#define inline

y en el futuro puede tener un significado real, de lo contrario, ¿por qué se introduciría?

 
A100:

No tiene efecto ahora, porque en MQL está como ausente ahora

y en el futuro puede tener un significado real, si no, ¿por qué se habría introducido?

Por lo que recuerdo de la ayuda a la versión, se introdujo como un stub para permitir inlinear archivos *.h.

 
En cuanto al orden de llamada de las funciones cuyos retornos se pasan como argumentos a una función, el estándar c++ no impone requisitos al compilador sobre el orden de su cálculo, se pueden llamar en cualquier secuencia(https://en.cppreference.com/w/cpp/language/eval_order). La forma en que la analogía es aplicable a mql depende de los desarrolladores, que pueden haberse molestado en definirla o no.
Razón de la queja: