Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!mips!cs.uoregon.edu!ogicse!hsdndev!dartvax!mars!nic!kira!emily!wollman From: wollman@emily.uvm.edu (Garrett Wollman) Newsgroups: comp.lang.c Subject: Re: Increment Counters in declaration or in loop? (style question) Message-ID: <1991Jun14.034527.11467@uvm.edu> Date: 14 Jun 91 03:45:27 GMT References: Sender: news@uvm.edu Organization: University of Vermont - EMBA Computing Facility Lines: 77 [The original poster asks about style wrt for(init; cond; index++) { some_other_var++; other_stuff(); } versus for(init; cond; index++,some_other_var++) { other_stuff(); ] In general, I think that there are two types of situations here. For example, I might find myself doing something like: for(i=0,j=0; i 0) b[j++] = a[i]; where clearly, the increment of j cannot be done within the context of the for itself, because it is conditional. However, in many cases, this is not true. Generally, these fall into two categories: either the programmer is trying to hand-optimize the code, or the programmer is trying to express what stylistically ought to be a while loop as a for loop instead. I do not understand why people do that. Perhaps it makes dealing with certain brain-damaged debuggers easier to have for(init; cond; action1,action2,action3); than init; while(cond) { action1; action2; action3; } It's a good obfuscatory technique, but I don't think anyone would disagree with me when I say that the latter is stylistically much better. The other case, that of hand-optimization, is somewhat more difficult. I know that all of the compilers I use can do a much better job of strength-reduction, loop unrolling, CSE, constant code motion, and all the rest, than I can. So in general, instead of doing something like the originally proposed for(i=0; i < imax; i++) printf("%d: %c\n",i,str++); I would instead almost always prefer for(i=0; i < imax; i++) printf("%d: %c\n",i,str[i]); since I am certain that *if* the second form were more efficient than the first *on my specific target machine*, then the compiler would do the conversion automatically, and probably allocate a register for the temporary copy of str as well, not to mention other potential optimizations. I would be surprised if GCC doesn't do this under -O -fstrength-reduce [and a bunch of other -f's all of which IMHO should be enabled by -O automatically], at least for some values of 'target machine'. And, in fact, I find that it does just that (when I substitute a pointer type which is non-trivial) on the NS32532 in this MultiMax; MIPS CC on the SGI 4D/240S does exactly the same thing (comparing -O0 with -O2). So that's my opinion. Perhaps Dan Bernstein will disagree. -GAWollman Garrett A. Wollman - wollman@emily.uvm.edu Disclaimer: I'm not even sure this represents *my* opinion, never mind UVM's, EMBA's, EMBA-CF's, or indeed anyone else's.