[Info-vax] decrementing & for loops in C

johnwallace4 at yahoo.co.uk johnwallace4 at yahoo.co.uk
Thu Jan 8 08:35:10 EST 2009


On Jan 8, 1:17 pm, "Bob Eager" <rd... at spamcop.net> wrote:
> On Thu, 8 Jan 2009 13:03:32 UTC, vax... at chemie.uni-konstanz.de wrote:
> > int main (void) {
>
> > int i,sum=0,n=10;
>
> >     (void)printf ("Starting countdown loop...\n");
> >     (void)fflush (stdout);
> >     for (i = n; i = 0; i--) {
> >         (void)printf (" i: %i\n",i);
> >     }
> >     (void)printf ("done.\n");
>
> >     (void)printf ("Starting normal loop...\n");
> >     (void)fflush (stdout);
> >     for (i = 1; i <= n; i++) {
> >         (void)printf (" i: %i\n",i);
> >     }
> >     (void)printf ("done.\n");
> > }
>
> > Here is the output:
>
> > r SYSWRITE_TST
> > Starting countdown loop...
> > done.
> > Starting normal loop...
> >  i: 1
> >  i: 2
> >  i: 3
> >  i: 4
> >  i: 5
> >  i: 6
> >  i: 7
> >  i: 8
> >  i: 9
> >  i: 10
> > done.
>
> > So the countdown loop is ignored. g++ under linux behaves the same.
>
> There's a logical error in the code. The second part of if() is the
> condition to be fulfilled to keep the loop going (see the normal loop,
> where it's going to keep going as long as i is less than or equal to n).
>
> So it says:
>
>  for (i = n; i = 0; i--) {
>
> (i.e. "keep going as long as i is zero", which it obviously isn't)
>
> It should be:
>
>  f
>
> (i.e. "keep going as long as i is not zero")
> --
> Bob Eager

Nothing VMS specific here, just a well known problem with C and its
users (including me).

Some people suggest reversing the logical expression so the constant
is on the left
for (i = n; 0 != i; i--) { // Does what the user wanted

}
By doing this, it is immediately obvious to the compiler that an
assignment has been unintentionally used:
for (i = n; 0 = i; i--) { // syntax error
}

Some kinder compilers will (optionally) offer a warning when an
assignment rather than a logical expression is used in this context.

Occasionally (just occasionally) it's desirable to have an assignment
rather than a logical expression. Allegedly.



More information about the Info-vax mailing list