Sujet : Re: Loops (was Re: do { quit; } else { })
De : bc (at) *nospam* freeuk.com (bart)
Groupes : comp.lang.cDate : 15. Apr 2025, 21:46:32
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vtmgj8$g81k$1@dont-email.me>
References : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
User-Agent : Mozilla Thunderbird
On 15/04/2025 20:07, Scott Lurndal wrote:
bart <bc@freeuk.com> writes:
On 15/04/2025 14:19, Kaz Kylheku wrote:
Thats's fine. But it means a real 'for' loop doesn't exist in C; you
have to emulate it using that 3-way construct, which is naff, and also
error prone.
Real for loops _are_ a three-way construct.
135 FOR I=1 TO 10 STEP 2 [BASIC]
for(i = 1; i < 11; i += 2) [C/C++]
do 1 = 1, 10, 2 [FORTRAN]
Any step other than 1 is unusual. So Basic and Fortran would typically be:
for i = 1 to 10 # 6 tokens; Basic
do i = 1, 10 # 6 tokens; Fortran
for i = 1, 10 # 6 tokens; Lua
for i to 10 do # 5 tokens; Mine (using default start)
to 10 do # 3 tokens; Mine (when index is not needed)
Let's look at that C again:
for (int i = 1; i < 11; i += 1) # 15 tokens; C
* I've added 'int' for the C, as most of the above don't need a
declaration for the loop index. But it will still be 14 without
* I use += for the increment because you did. ++ saves one token,
but it's still at 13/14 tokens
* All the above can directly use 10 as the upper bound; C has to use
11 when written idiomatically
Even using a step of two, that would only add 2 tokens to the above; C will still need 14/15 tokens.
Note that C's for-loop is dumb; it merely take three expressions A B C that can be completely unrelated, and arranges them into a loop:
A; while (B) {...; C}
SPRITE also had:
UNTIL done, notfound
DO
...
IF token = "this"
THEN LOOP_EXIT done
FI;
...
IF i = upb(table)
THEN LOOP_EXIT notfound
FI;
...
OD
CASE
IS done: write("i=", i);
OR notfound write("not found", upb(table));
That's pretty weird, but whatever it does, it's nothing to do with iterating a variable over a range.