- Unix and its inertia
- Licensing of Unix allowing it to proliferate to the masses and being used for education
- because it is simple enough that a compiler can be quickly brought up for any new ISA that appears, as long as it looks enough like a 70's-80's CPU architecture enough for pointers to work.
Elegant? No.
- Making pointers and arrays synonymous is elegant only from the CPU's perspective.
- The pointer syntax sucks.
- Casting does weird stuff sometimes.
- Bool - how hard is it to get true and false right?
- Everything being an operator leads to the confusion between assignment and equality which is inelegant. It was cute in the 70's when you had limited disk space but sucks now.
- `void *` being used for function pointers is not elegant.
- Threads and any notion of multiple CPUs doesn't work well without a lot of libraries or help.
- An elegant language would have not cared about the underlying CPU memory model, but C had to be enhanced for 16-bit x86 segmented memory models.
- If you are using intrinsics or whatever to generate assembly opcodes (e.g. vector instructions) because your language doesn't support them, you are surpassing the limitation of your language in an inelegant way.
- An elegant language makes things like the IOCCC impossible.