I always thought it was because programmers were too lazy to write a couple of extra characters to make a nice descriptive variable name. At least that's why I do.
Nah. A variable name's descriptiveness (and length) should be proportional to the size of the scope in which it's used. A simple loop index should almost never be longer than i, j, k, etc.
for i in $(exceptionally long pipeline that doesn't work right now)
Because someone didn't tell you what I was supposed to be.
Or being a few lines down the bottom of a very long loop, and trying to remember what 'i' represents this time round.
float f;
unsigned u;
char c;
key_t k;
That's how I swing, man.