Вопрос по MQL4-программированию для Loops и Break - PullRequest
0 голосов
/ 03 июля 2019

Я новичок в 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 Ответ

1 голос
/ 03 июля 2019

Решение не имеет ничего общего со значением S:

Есть несколько вещей, на которые следует обратить внимание:

В языке со строгой типизацией, MQL4В этом случае объявление переменной помогает процессу компилятора утверждать собственный тип данных переменных, чтобы зарезервировать достаточно места для хранения соответствующих значений и выбора надлежащих инструкций для манипулирования с соответствующим содержимым переменной в функциях.Таким образом, вы явно объявляете соответствующий тип значения, но не всегда начальное значение (это зависит от языка и довольно опасно для неявной магии): int, double, string, 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_> состоит из одного оператора, как в случае с оператором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; просто сломал остальную логику.

Либо удалите полную синтаксическую структуруif(...)break; или испытайте эффекты:

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