your "improved" version illegally modifies 'i' twice in the same statement; its results are undefined.
The possibility that I consider unlikely, of course, is that I've broken some assumption that causes the compiler to optimize cause an entirely undefined third behavior (such as crashing). Then the outcome is undefined. That is the kind of implementation detail that code golf often brushes against. I'm not sure whether a solution that includes that possibility but which happens to work on, say, gcc is considered legal.
But that suggests the following unambiguous form:
int i,x[99];for(x[98]=i=1;x[98];)i*=!++x[++i];It's undefined behavior. Any outcome is likely. The compiler could halt your program immediately if it wanted to, and that's just as likely as either of the cases you offer.