Marcin_ napisał(a)
w petli for (i=0; i<100; i++) powiniem zrobic "if (costam) i=100;
Akurat w C (i jemu podobnych) jest to możliwe, ale w Pascalu/Delphi nie można zmieniać licznika, gdyż nie jest on analizowany za każdym przejściem pętli.
Nawet pomoc Borlanda o tym pisze:
It is illegal to assign a value to the for loop control variable inside the for loop.
If the purpose is to leave the loop prematurely, <font color="red">use a break or goto statement</span>.
Kopiuj
program Produce;
var
I: Integer;
A: array [0..99] of Integer;
begin
for I := 0 to 99 do begin
if A[I] = 42 then
I := 99;
end;
end.
In this case, the programmer thought that assigning 99 to I would cause the program to exit the loop.
Kopiuj
program Solve;
var
I: Integer;
A: array [0..99] of Integer;
begin
for I := 0 to 99 do begin
if A[I] = 42 then
Break;
end;
end.
<font color="red">Using a break statement is a cleaner way to exit out of a for loop.</span>
Ja nie widzę żadnych przeciwskazań w używaniu break - co więcej - uważam to za jedno z najbardziej przydatnych słów kluczowych języka [piszę w C++ / C# / PHP / JS więc wsie C-podobne, gdzie mogę ingerować w licznik].
Przez myśl mi nie przeszło tak koszmarne rozwiązanie, jak if (cos) i=100;
Jeśli pominąć optymalizator, to taki kod będzie dłuższy i wolniejszy o kilka instrukcji w Assemblerze oraz mniej czytelny dla człowieka, bo nie zawsze mamy jawną wartość końca pętli, przykład [tak oczywiście się nie robi, ale to tylko przykład]
Kopiuj
for (int i=0; i<JakasFunkcja(); i++)
{smth = doSmth();
...
if (smth) break;
}
i co, miałbym tam dać
if (smth) i=JakasFunkcja(); ? nonsens...
A co jeśli mamy taki kod:
Kopiuj
for (float i=0; i<=20.2; i++)
{
...
if (smth) i=20.3; //co to w ogóle ma być? porażka, nawet jak dam ładniej i=30
}