Решение не имеет ничего общего со значением 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;
}