for(int i=0 ; i<100;i++);
System.out.println(i);
This is the same as:
for(int i=0 ; i<100;i++)
;
System.out.println(i);
An empty semi-colon counts as a statement. So the for-loop statement is the empty statement, and System.out.println() executes after the for loop (though it would fail because i was declared in the for-loop scope and invalid outside the for-loop). It's considered an empty statement (because it does nothing). Though I did miss that in my definition of statement.
new definition which allows for empty statements:
statement = (expression? ";") | ("{" statement* "}")
So, following the for-loop construct (added quotes to clarify definition a bit):
"for" "(" expression? ";" condition? ";" expression? ")"
statement