¿Por qué los índices de las matrices comienzan en cero en C?
¿Por qué la indexación en una matriz comienza con cero en C y no con 1? ¿Por qué el primer elemento de una matriz está a
en a[0]
y no a[1]
?
En C, el nombre de una matriz es esencialmente un puntero [pero vea los comentarios] , una referencia a una ubicación de memoria, por lo que la expresión array[n]
se refiere a n
elementos de una ubicación de memoria alejados del elemento inicial. Esto significa que el índice se utiliza como compensación. El primer elemento de la matriz está exactamente contenido en la ubicación de memoria a la que hace referencia la matriz (0 elementos de distancia), por lo que debe indicarse como array[0]
.
Para más información:
http://developeronline.blogspot.com/2008/04/why-array-index-should-start-from-0.html
Esta pregunta se publicó hace más de un año, pero aquí va...
Sobre las razones anteriores
Si bien el artículo de Dijkstra (al que se hace referencia anteriormente en una respuesta ahora eliminada ) tiene sentido desde una perspectiva matemática, no es tan relevante cuando se trata de programación.
La decisión tomada por la especificación del lenguaje y los diseñadores del compilador se basa en la decisión tomada por los diseñadores del sistema informático de comenzar a contar en 0.
La razón probable
Citando un alegato por la paz de Danny Cohen.
- Enlace IEEE
- IEN-137
Para cualquier base b, los primeros b^N enteros no negativos están representados exactamente por N dígitos (incluidos los ceros iniciales) solo si la numeración comienza en 0.
Esto se puede probar con bastante facilidad. En base 2, toma 2^3 = 8
el octavo número:
- 8 (binario: 1000) si empezamos a contar en 1
- 7 (binario: 111) si empezamos a contar en 0
111
se puede representar usando 3
bits, aunque 1000
requerirá un bit adicional (4 bits).
¿Por qué es esto relevante?
Las direcciones de memoria de la computadora tienen 2^N
celdas direccionadas por N
bits. Ahora, si comenzamos a contar en 1, 2^N
las celdas necesitarían N+1
líneas de dirección. El bit extra es necesario para acceder exactamente a 1 dirección. ( 1000
en el caso anterior). Otra forma de solucionarlo sería dejar la última dirección inaccesible y utilizar N
líneas de dirección.
Ambas son soluciones subóptimas , en comparación con el recuento inicial en 0, lo que mantendría todas las direcciones accesibles, ¡usando exactamente N
líneas de dirección!
Conclusión
Desde entonces, la decisión de comenzar a contar en 0
, ha permeado todos los sistemas digitales , incluido el software que se ejecuta en ellos, porque simplifica la traducción del código a lo que el sistema subyacente puede interpretar. Si no fuera así, habría una operación de traducción innecesaria entre la máquina y el programador, por cada acceso a la matriz. Facilita la compilación.
Citando el artículo:
¿Quién va primero? ¿Cero o uno?
La gente empieza a contar desde el número uno. La misma palabra primero se abrevia como 1º, lo que indica uno. Ésta, sin embargo, es una notación muy moderna. Los conceptos más antiguos no necesariamente respaldan esta relación.
En inglés y francés, la palabra primero no se deriva de la palabra uno , sino de una antigua palabra para príncipe , que significa primero . De manera similar, la palabra inglesa segundo no se deriva del número dos sino de una palabra antigua que significa "seguir". Obviamente, existe una estrecha relación entre tercero y tres, cuarto y cuatro, y así sucesivamente.
Estas relaciones también ocurren en otras familias lingüísticas. En hebreo, por ejemplo, primero se deriva de la palabra cabeza , que significa "el más destacado". La palabra hebrea para segundo se deriva de la palabra dos; esta relación de nombres ordinales y cardinales es válida para todos los demás números.
Durante mucho tiempo, la gente ha contado desde uno, no desde cero. De hecho, la inclusión del cero como miembro de pleno derecho del conjunto de todos los números es un concepto relativamente moderno, aunque sea uno de los números más importantes matemáticamente. Tiene muchas propiedades importantes, como ser múltiplo de cualquier número entero.
Un bonito teorema matemático establece que para cualquier base b los primeros bⁿ enteros positivos están representados por exactamente n dígitos (incluidos los ceros a la izquierda). Esto es cierto si y sólo si el conteo comienza con cero (por lo tanto, de 0 a bⁿ-1), no con uno (de 1 a bⁿ).
Este teorema es la base de la memoria de una computadora. Normalmente, 2ⁿ celdas se direccionan mediante un esquema de direccionamiento de N bits. Un recuento que comience desde uno en lugar de cero provocaría la pérdida de una celda de memoria o de una línea de dirección adicional. Dado que cualquiera de los precios es demasiado caro, los ingenieros informáticos acuerdan utilizar la notación matemática que comienza con cero. ¡Bien por ellos!
Esta es probablemente la razón por la que todas las memorias comienzan en la dirección 0, incluso aquellas de sistemas que cuentan bits desde B1 en adelante.
Los diseñadores del 1401 probablemente se avergonzaron de tener la dirección 0. Lo ocultaron a los usuarios y fingieron que la memoria comienza en la dirección-1.
Los ingenieros en comunicación, como la mayoría de las personas, empiezan a contar desde uno. Nunca tendrán que sufrir la pérdida de una célula de memoria, por ejemplo. Por lo tanto, cuentan felizmente del uno al ocho, no del cero al siete, como lo hacen los informáticos. árbitro