Rainer Weikusat <[email protected]> writes:
> Didier Kryn <[email protected]> writes:
>
> [...]
>
>>> A multi-line version could look like this:
>>>
>>> while (c = *r) {
>>>     ++r;
>>>          if (c == '/') n = r;
>>> }
>>>
>>
>>     It might be done with a for loop.  eg:
>>
>>     for ( ; *r ; ++r) if(*r=='/') n=r;
>> n++;
>
> [...]
>
>> The for loop is the best construct for a loop with an incremental
>> cursor.
>
> That's nicely exemplified by the fact that the code above does a
> redundant increment (or did a redundant increment would it work, the {}
> are missing) solely to work around

[...]

>  the "for loop

While making fun of other people's statements in this way may be ... well
... fun, it's not very nice and also not exactly useful.

A C 'for loop' is a pretty strange control construct (one could call it
'overly generic'). It's definition (from K&R 2nd ed) is

        for (expression1; expression2; expression3) statement
   
        is equivalent to

        expression1;
        while (expression2) {
              statement
              expression3;
        }

        [in absence of a continue in 'statement']

That's a generalization of a loop with the abstract structure

<init stmts>;
while (<test expr>) {
        <body stmts>;
        <step stmts>;
}

with

<init stmts>
        Sequence of statements intializing a set of loop control
        variables.

<test expr>
        Test expression. Used to compare loop control variables or
        values depending on loop control variables with a termination
        condition (or 'continuation condition' for C). If the loop
        should execute once more, the

<body stmts>,
        a sequence of statements making up the loop body, are
        executed. These may perform operation depending on the current
        value of loop control variables but don't modify them
        themselves.

<step stmts>
        Sequence of statements changing the loop control variables
        possibly based on results from the <body stmts> to 'the next
        state' prior to evualting the <test expr> again.

but the C for (;;;) doesn't enforce any of these semantic conventions
but is really more of a macro which tranposes the text inside the (;;;)
as indicated above. Each of the expressions of a for (;;;) may contain
arbitrary C expressions, ie, anything except C control constructs.

If one happens to be writing a loop following the abstract description
given above, for (;;;) can be used to express it fairly
straight-forwardly if it isn't too complicated. The 'classic' example
would be the C-approximation of a counting loop,

for (int i = 0; i < 10; i++) printf("%d\n", i);

But the loop in

static char const *get_name(char const *arg0)
{
    char const *n, *r;

    n = r = arg0;
    while (*r) if (*r++ == '/') n = r;
    return n;
}

is not of this type. It contains an init-statement,

n = r = arg0;

followed by a test expression,

while (*r)

followed by another test of the same value,

if (*r == '/')

followed by a step-statement,

if (*r++ == '/)

followed by an assignment which should only be executed if the test was
true but which should use the value modified by the step expression.
_______________________________________________
Dng mailing list
[email protected]
https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng

Reply via email to