Algunos lenguajes de programación populares usan la numeración de meses, que está desviada en 1; me viene a la mente JavaScript, al igual que Java, y si la memoria funciona, C es otra. Tengo algunas preguntas:
- Si va a ignorar la numeración de meses utilizada por los laicos, entonces, ¿por qué no, en aras de la coherencia, también ignorar la numeración de días utilizada por los laicos y numerar los días de cada mes comenzando desde 0?
- ¿Por qué esto es tan común?
- ¿De quién fue la idea en primer lugar?
date
language-agnostic
language-design
Robert L
fuente
fuente
Respuestas:
El uso de cero para comenzar a contar es en realidad un truco de optimización de los programadores de Ensamblador. En lugar de asignar 1 al registro de conteo, hicieron XOR del registro consigo mismo, que fue un poco más rápido en los ciclos de la CPU. Esto significaba que el conteo comenzaría con 0 y siempre alcanzaría la longitud de los elementos, excluyendo el último.
Además, el uso de cero también es popular en la aritmética de punteros, donde se usaría un puntero base que apunta a alguna memoria asignada, más un segundo puntero que estaría en un desplazamiento de este puntero base. Aquí, usar el valor cero tiene mucho sentido para apuntar el desplazamiento a la base del bloque de memoria. (La lógica de matriz general tiende a ser la dirección base más el desplazamiento x tamaño de registro).
¿Y números de mes basados en cero? A menudo, muchos entornos de programación calculan los datos como un número de días desde algunos datos predeterminados. El 31 de diciembre de 1899 es una fecha popular, aunque se han utilizado muchas otras fechas como fecha base. Todas las demás fechas se compensan con esta base y solo se almacenarán como un solo número. Las fracciones se utilizarían para indicar horas, minutos y segundos, donde 0,25 sería 24/4 = 6 horas. Por lo tanto, para transformar una fecha en una fecha real, todo lo que tiene que hacer el entorno es transformar este número en una fecha real.
Sin embargo, la combinación de matrices de base cero y valores de mes basados en 1 trae un problema. Para obtener el nombre del mes del mes 9, tendría que obtener el elemento 8 de la matriz del mes. Algunos desarrolladores estarían contentos con disminuir el número de meses antes de obtener su nombre. Otros prefirieron cambiar el mes a algo basado en cero, ya que la gente solo quiere saber el nombre, no el número. Es una vista personal.
fuente
monthName[monthNumber]
omon_name[tm_mon]
con notación time.h .Es lo que es, y el enorme peso del software creado bajo esa suposición significa que estará disponible por un tiempo.
Mi opinión es que fue culpa de C, y todos esos otros lenguajes Johnie-come-últimamente simplemente se conformaron con él.
Obtienes algunas situaciones divertidas de personas que no conocen mejor. Uno de los pocos errores del año 2000 que nuestro equipo encontró fue un sitio web que proclamaba con orgullo que el año era 19100 simplemente porque antepusieron el
struct tm
año con el literal "19".fuente
Sí, los romanos también tuvieron problemas con el cero.
Esto es
solouna consecuencia [no intuitiva] de las matemáticas (siendo un componente fuerte de la programación, especialmente la programación temprana) que define cero como el primer (término problemático ese uno) número real,positivo* natural, y dado que una matriz está indexada con real , números naturales, el "primer" elemento está en el índice 0.Los meses son realmente valores con nombre en una matriz, donde los días y los años son valores numerados; quizás sería más útil pensar en los días / años como en matrices que se parecen a {"1", "2", "3",. ..} ellos mismos.
En cuanto a por qué esto es tan común (además de ser matemáticamente correcto) bueno, todos los idiomas que enumeró descienden de un origen común para una cosa ...
Editar:
Mirándolo más a fondo, este enlace de wikipedia detalla varias razones buenas e interesantes para la indexación cero (que no habla directamente de por qué los meses tienen indexación cero, pero creo que ya está cubierto), y este enlace SO ha respondido la pregunta antes.
Parece que la opinión predominante es "accidente histórico" o "porque los meses no son números, por lo que no se pueden comparar con el almacenamiento de día / año", según a quién le pregunte.
* Lo siento, lo siento, la física! = Las matemáticas vuelven a morderme allí. Me voy a planchar las manos ahora.
fuente
a[0]
==*(a + 0)
.