“People of God, from that encounter my life has never known peace. For the past two years it has been one problem or the other. [...] The following day, snakes started manifesting in my house physically.” —Uhrie Anthony Having shepherded several novices to programming, including myself, I find that the universal reaction to "arrays start at 0" is "WTF". And they're right. WTF. I explain patiently that 0 is not an index, not the number indicating which element it is, but an offset. I then explain how pointers and memory work in C, and the fact that a[offset] is equivalent to *(a+offset). Sometimes, if I think they will find the tangent amusing, I point out the fact that [] is commutative. [] is often called "subscripting", which I also understand, but which is also dumb. So, I've made my peace with [0] by referring to it as "0-offset" instead of "0-index". However, I still believe the convention of 0-indexing is harmful, in that it creates great confusion in everything it touches. First, I would like to point out that the convention is entirely arbitrary: C could have defined a[n] to mean *(a+n-1). Indeed, this would increase my estimation of the C programming language, as I currently view it to have been frightfully unparsimonious with its pointer-related syntax. Consider the following (I am omitting type specifiers and type operators): &x: what is the address of x (this looks tantalizingly like a unary and) *x: what is at the address stored in x (this looks tantalizingly like a unary multiply) x[n]: *(x+n) x.m: *(&x+offsetof(x, m)) x->m: *(x+offsetof(*x, m)) As I understand it, there's sort of a long and boring history around this syntax, but I maintain it's overcomplicated. I once began to amuse myself by concieving of a C dialect that had only one dereference operator, probably "$", that could handle all of these cases, but then I remembered I had more important things to do, and that if I ever invented a language it would be too unlike C for this puzzle to be worth contemplating. (apparently, C's grandfather language, BCPL, already worked kind of like this, using the operator !, as it happens.) But the point is, if [] also added 1, in order to make array accesses 1-indexed, I would consider that a decent, instead of redundant, piece of syntactic sugar. Indeed, in FORTRAN arrays always started at one, and this was simply for programmer convenience, and all was right and good. Well, except for the fact that you had to write in FORTRAN. Second, I would like to address the main reason why 0-indexing is the wrong convention: it is unergonomic. Most of us have trained for years, very often in normal life, to deal with lists of elements 1 through N. 0-indexing means applying your common number sense in programming arrays is not only useless, but actively harmful. You have to develop a whole new perverse number sense to deal with arrays. Third, I would like to point out that 0-indexing makes an off-by-one error between the ordinals and the cardinals. In ordinary life, if you have a list of 1 element, it's the 1st element. If you have a list of 2 elements, there's a 1st element and a 2nd element. And so on. In 0-indexing, you suddenly have to deal with a 0th element and an (n-1)th element, and so your surefooted assumption that the last element of a list of N elements shall be N and the first shall be 1 is upended. Fourth, I would like to list some things that have been damaged by their exposure to 0-indexing, and thus make less sense: When programmers iterate over an array in C (something programmers are particularly fond of doing, for whatever reason) they use a for loop, which has the general form of for(set up this data before the loop body; run this code at the beginning of each loop iteration to check if we should stop iterating; run this code at the end of each loop iteration to keep track of where we are){loop body of instructions to perform each iteration}. This in itself is kind of a pernicious overcomplication of the structure of iterating over things, but whatever. C programmers thus typically find themselves writing for(int i=0; i