I agree with BadKarmaZen, I can not remember the last time I used 'i' as an itterator.
I used to think I wrote pretty understandable code and liked the ideom of a single character that specified: indexer. Then I read 'code complete'...
The whole book "Code Complete" (just like 'Design patterns' from the G.o.F.) is about managing complexity. I took a good look at the code I had written thusfar and came to the conclusion that what seems completly obvious at the moment of writing, after 6 months any loop with 'just an indexer' needs to be reverse enginered. (Boy, did my code suck.)
The most important thing that stuck after reading the book has now become my personal mantra: "Things always get more complex/ change is the only constant."
With that in mind, a loop with just an 'i' indexer will grow to the point that the variable name is no longer appropriate and needs to be changed. If you know that in advance you might as well give it a good name to start with. For that very same reason I will always use block delimiters for 'if' statements and throw exceptions in the 'default' clause of an switch statement.
If you do not, somewhere in the future it will come back to haunt you.
Of course, using an "for each" loop is even better but not always possible.
Small note: three nested loops with variable names i,j,k is just begging for trouble. Create 100 of those in an application and you'll have a job for life.