Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!watmath!clyde!burl!ulysses!bellcore!decvax!decwrl!pyramid!pesnta!hplabs!sdcrdcf!ucla-cs!matt From: matt@ucla-cs.UUCP Newsgroups: net.micro.mac Subject: Re: Megamax bug? Message-ID: <15824@ucla-cs.ARPA> Date: Mon, 16-Jun-86 00:13:56 EDT Article-I.D.: ucla-cs.15824 Posted: Mon Jun 16 00:13:56 1986 Date-Received: Tue, 17-Jun-86 11:51:18 EDT References: <1023@k.cs.cmu.edu> <219@analog.UUCP> <1436@fisher.UUCP> Distribution: net Organization: UCLA CS Department Lines: 49 In article <1436@fisher.UUCP>, njt@fisher.UUCP (Nathaniel Thurston) writes: - In article <219@analog.UUCP> kim@analog.UUCP (Kim Helliwell) writes: - >> for (i = ntables; i--; ) - >> if (i == -1) - >> - >> I would expect this to get the value of i, decrement the stored value, - >> and then exit or execute the statement. Rather, it tests the value - >> before it decrements, and the loop exits with i = 0. Is this a bug - >> in the code generation, or is C supposed to do this? - >> - >> Greg - > - > for (i = ntables; ; i--) - > if (i = -1) - > - >Kim Helliwell - - You're both wrong. The first loop should perform the action Greg describes, - using the value before decrementing. To have C test the value after - decrementing, use --i. In the "fix" that Kim gives, the loop will never - exit without a break statement. - The correct code is: - for (i = ntables; --i; ) - if (i == -1) - -- - I believe Greg is right. When the loop falls through, `i' should end up as -1. If in fact it does not, the C compiler forgot to generate the trailing DEC instruction on that branch of the test. This seems serious, since checking a post-condition like this is fairly common in C; are you sure? Kim's code is wrong, and would never exit (empty condition == true). Also the trailing test has an assignment (i = -1) instead of a conditional (i == -1). Thus, that test would always succeed. Nathaniel's code is wrong, since I presume Greg intended to execute the line if the loop fell through (vs. a `break'); these statements would not be executed if the loop fell through at i==0. The correct condition here (if it were the right test, which it ISN'T for traversing arrays) would be `if (i == 0) ...'. Sigh. - Matt ------- UUCP: {ucbvax,ihnp4,randvax,trwrb!trwspp,ism780}!ucla-cs!matt ARPA: matt@LOCUS.UCLA.EDU