Curiosidades del C pre-ANSI: lo que K&R no enseñaba en clase

Fuentes: a bunch of stuff i used to not know about K&R C

Una investigación个人 sobre las peculiaridades del C de K&R (pre-ANSI) revela diferencias notables con el lenguaje estandarizado que se enseña hoy. El autor, tras leer la primera edición de "The C Programming Language", el documento de razonamiento de C89 y el código del compilador de Unix 7ª edición, documenta hallazgos sorprendentes.

Entre los puntos más llamativos está la ausencia de void, una invención de ANSI: las funciones devolvían implícitamente int y, al no haber chequeo de tipos en punteros, char * hacía las veces de puntero genérico. Tampoco existía el especificador signed, solo unsigned, y las combinaciones de especificadores eran mucho más restringidas: no había unsigned short int, solo unsigned int. long float era sinónimo de double, pero long double no existía.

Otro hallazgo es la falta de un sufijo U para constantes enteras sin signo y el comportamiento peculiar de las constantes no decimales: si cabían en unsigned int, se trataban como int, lo que podía provocar desbordamientos silenciosos. Además, los dígitos 8 y 9 eran válidos en constantes octales (078 y 0100 representaban el mismo valor), no existían las secuencias de escape \a, \v ni \x, y un backslash inválido simplemente se ignoraba.

El texto también aborda la promoción de enteros y el debate entre las reglas "unsigned preserving" y "value preserving" que dividió a los compiladores antes del estándar. ANSI terminó adoptando las segundas, pese a que los compiladores de Unix evolucionaban hacia las primeras. Por último, operaciones como sizeof y la resta de punteros devolvían int en lugar de size_t/ptrdiff_t, ambos inventos de ANSI.