使用MQL4编程进行循环和中断的问题

时间:2019-07-03 06:26:31

标签: mql4

我是MQL4的新手,可以通过该网站学习代码。 阅读有关break;的代码并进入此源代码。

这是我试图理解的代码。 请帮助我了解变量的答案。 预先感谢。

void OnTick()
{
    int a, b, L, s, S, A, B;      // (---Variable Initializing.---)
    L=1000;                       // (---Value for L is 1000 assigned.---)
    for ( a = 1; a < L / 2; a++ ) // (---Now value of a=1
    {                             /*              and a is smaller then 500
                                         so condition is true
                                            and value of a is 499 Now---)
                                     */

       b = ( L / 2 ) - a;         // (---Now b=1000/2=500-499, So value of b is 1)
       s = a * b;                 // (---Now s=499*1=499---)
       if ( s <= S ) break;       /* (---After using if statement,
                                             s is smaller then or equal to S.
                                         there is no value assigned to "S".
                                         So how the condition gets TRUE.---)
                                     */
       A = a;                     // (---now Value of A is 250---)
       B = b;                     // (---now Value of B is 250---)
       S = s;                     // (---now Value of A is 62500---)
    }
    Comment( "  S= ", S,
             ", A= ", A,
             ", B= ", B
             );
    return;
}

我的问题是:

if(s<=S)语句如何成立并循环中断以回答S=62500, A=250, B=250

在删除if语句后,答案为S = 499,A = 499,B = 1。

1 个答案:

答案 0 :(得分:1)

该解决方案与 S 的值无关:

有几件事要注意:

在强类型语言中,MQL4是一种情况,变量声明可帮助编译器进程断言变量本机数据类型,以便保留足够的空间来容纳各个值并选择适当的指令来在函数中使用变量各自的内容进行操作。因此,您明确地声明了值的各个类型,但并不总是初始值(这是特定于语言的,并且很容易发生隐式魔法):{{1} },intdoublestring等,声明和初始化的安全性更高:

datetime

下一个 int a = EMPTY, b = EMPTY, L = EMPTY, S = EMPTY, ... B = EMPTY;

该代码具有某些语言定义的语法结构。 break 语句的一般结构可能具有以下正式结构:

if

if( <_aCondition_> ) { <_an_If_ed_CodeExecutionBLOCK_> } else { <_an_Else_ed_CodeExecutionBLOCK_> } 由单个语句组成的情况下(如您在 <_aCodeExecutionBLOCK_> 的情况下那样),就不需要包围的大括号{{1 }},这样的单条语句可能会在语法结构前缀之后的左侧“裸”之后

break;

理论也是如此,接下来是您遇到的问题的答案-如果您仅删除{...;},而将“裸” if( <_aCondition_> ) break; 留在原处,则现在必须在第一个执行通过if( <_aCondition_> )代码块,结果就只能是您自己确认的显示的break;,因为裸露的for(...){...}确实破坏了代码块的执行流程,并且在结束 a = 1; b = ( L / 2 ) - 1; s = a * b; 之后立即从第一个循环运行的前几步跳转。

break;

赤裸裸的}破坏了其余的逻辑。

要么删除完整的语法结构void OnTick() { ... for ( a = 1; a < L / 2; a++ ) { b = ( L / 2 ) - a; s = a * b; /* if ( ... ) // . . . . . . . . . . . . . . . . a half-removed if() */ break; // _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ WILL STILL JUMP ... } Comment( " S= ", S, ", A= ", A, ", B= ", B ); return; } ,要么体验一下效果:

break;