As for for loops they are just shorthand for a commonly used form of while statement, kludging less common forms of while into them with comma operators is more confusing than just using while.
I've always seen a "for" loop as being iterative over a sequence, and a "while" loop as being repetitive conditional on an external state - for example, while the input given is invalid, continue giving an error message and requesting it again. I'd rather use a "for" loop to loop over some sort of container, even if the top of the loop is a little bit ugly, as it makes the intention clear.
I use
for over
while out of habit. Prior to optimization compilers, I read that
for( ; ; ) is far more efficient over
while(1). After confirming it by looking at the op codes actually generated, I confirmed that for my compiler do indeed generate much better code with
for( ; ; ) over
while(1).
Where I am doing a single task within the loop, I found the comma-inside-for much easier to read. Single (or very simple) looped task such as scanning for a particular case.
for (cp=startOfSomething,kp=endOfSomething;TestForEnd(cp);callthis(),prepareToReLoop) ;
Another case where I would use comma is to seperate substeps:
thisOne=(thatOne++,firstFunction(&thatOne));
A matter of style and habit, I suppose.