【问题标题】:Question with MQL4 programming for Loops and Break关于循环和中断的 MQL4 编程问题
【发布时间】:2019-07-03 06:26:31
【问题描述】:

我是 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&lt;=S) 语句如何为真并循环中断以回答S=62500, A=250, B=250

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

【问题讨论】:

    标签: mql4


    【解决方案1】:

    解决方案与S的值无关:

    有几点需要注意:

    在强类型语言中,MQL4 是这样一种情况,变量声明帮助编译器进程断言变量的本地数据类型,以便保留足够的空间来保存各自的值并选择适当的指令来执行在函数中使用变量的相应内容进行操作。因此,您明确声明相应的 type 值,但并不总是初始值(即特定于语言并且让隐式魔法发生非常危险):int, doublestringdatetime 等,其中更安全的是声明和初始化:

    int a = EMPTY,
        b = EMPTY,
        L = EMPTY,
        S = EMPTY,
        ...
        B = EMPTY;
    

    接下来是break

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

     if( <_aCondition_> )
     {   <_an_If_ed_CodeExecutionBLOCK_> }
     else
     {   <_an_Else_ed_CodeExecutionBLOCK_> }
    

    如果&lt;_aCodeExecutionBLOCK_&gt; 由单个语句组成,例如break;,则不需要括起来的一对花括号{...;} 和这样的单个语句语句可以紧跟在句法结构前缀之后的左侧“裸”

    if( <_aCondition_> )
        break;
    

    理论也是如此,接下来是您遇到的问题的答案 - 如果您仅删除 if( &lt;_aCondition_&gt; ),将“裸”break; 留在原处,现在必须在 @ 的第一遍执行987654336@-code-block,结果只能是你自己确认的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;简直打破了剩下的逻辑。

    要么删除完整的句法结构if(...)break;,要么体验效果:

    void OnTick()
    {    ...
         for ( a = 1; a < L / 2; a++ )
         {     ...
               if ( s <= S ) break;
               ...
         }
         Comment( "  S= ", S,
                  ", A= ", A,
                  ", B= ", B
                  );
         return;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-24
      • 2022-01-01
      • 1970-01-01
      • 2016-12-17
      • 2020-01-28
      • 1970-01-01
      • 2022-12-28
      • 2014-05-21
      • 1970-01-01
      相关资源
      最近更新 更多