[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