Perché i programmatori utilizzano l'indicizzazione basata su uno per i numeri di riga nel codice sorgente? [duplicare]

6

Perché la riga superiore in un file di codice sorgente non è etichettata con il numero di riga 0?

vale a dire. in un file sorgente lungo 10 righe, mi aspetterei che i numeri di riga sarebbero 0-9, ma non lo sono! Ora grep , awk , sed ecc. Sembrano tutti numeri da 1, quindi presumo che sia una convenzione stabilita per una buona ragione.

Di recente mi è venuto in mente che, per quasi tutte le altre strutture di cui un programmatore deve occuparsi nel lavoro quotidiano, la convenzione è contare da 0 - e un file sorgente è simile a un elenco di righe come un la linea è come una lista di caratteri (una lista di caratteri è sempre indicizzata a 0). Ho dovuto effettivamente aprire il mio editor di testo e la sanità mentale per verificare che la riga superiore di un file fosse etichettata con il numero di riga 1!

Mi stavo chiedendo se è un buon motivo per questo o se si tratta solo di una sfortunata convenzione storica.

    
posta wim 20.09.2011 - 08:51
fonte

5 risposte

7

Le schede perforate iniziarono alla riga 1:

La tradizione è rimasta ferma anche quando abbiamo smesso di usare le schede perforate. E, naturalmente, le lingue iniziali come FORTRAN, COBOL e ALGOL utilizzavano l'indicizzazione basata su 1.

    
risposta data 20.09.2011 - 13:19
fonte
46
  • L'indicizzazione basata su 0 è per computer non umani
  • i numeri di riga riguardano gli utenti non i computer
  • tutti gli umani non sono programmatori

I numeri di riga basati su 1 facilitano un po 'la leggibilità, altrimenti ogni volta che visualizzi un messaggio di errore con un numero di riga, dovresti ricordarti di decrementarlo di uno per ottenere la riga effettiva che ha causato l'errore - - e questo impedisce la leggibilità.

Anche line 1 legge meglio di line 0 - perché altri (persone che potrebbero essere non tecniche) potrebbero dover leggere il tuo codice.

    
risposta data 20.09.2011 - 08:59
fonte
10

for almost every other structure a programmer has to deal with in their day to day work, the convention is to count from 0

Questo è specifico della lingua e AFAIK è prevalente solo in C e i suoi successori . L'indicizzazione AFAIR è basata su 1 almeno nella famiglia Modula e BASIC Pascal / e possibilmente anche in linguaggi funzionali (che non usano molto l'indicizzazione, piuttosto iteratori o foreach ecc.).

In C, rendeva conveniente l'aritmetica dell'array / puntatore. Tuttavia, non credo che nessuno possa chiamarlo intuitivo - Credo che ci sia voluto del tempo prima che tutti noi ci abituassimo. Come ha sottolineato @greengit, è un concetto a livello di hardware, o piuttosto un dettaglio di implementazione. Solo i programmatori (C et al) devono comprendere e utilizzare l'indicizzazione basata su 0, ma provare a spiegarlo a un laico: -)

Quando si ha a che fare con file di file, raramente si utilizza l'aritmetica del puntatore: un file di righe di testo è semplicemente un livello più alto di astrazione. E ancora di più, poiché i file di testo sono utilizzati da molte persone che non sono programmatori C, solo utenti "semplici". Rendere la loro vita più complicata costringendoli ad apprendere un dettaglio di implementazione di basso livello sarebbe del tutto controproducente.

E un'altra cosa importante: i file di testo (e prima di essi, le schede perforate) esistono da decenni prima della nascita di C , quindi credo che il tempo in cui C è stato creato, contando le loro linee / rows from 1 era già una convenzione ben stabilita.

    
risposta data 20.09.2011 - 09:00
fonte
5

Ho programmato in Basic. I numeri sarebbero in genere 10, 20, 30. Potresti aggiungere linee extra come 15 e poi usare "renum" per fare 10, 20, 30, 40. E questi numeri erano importanti dato che hai usato "goto 15".

Quindi le righe non sono sempre state numerate come 1,2,3

    
risposta data 20.09.2011 - 08:56
fonte
1

La cosa "naturale" da fare è il conteggio basato su 1, come facciamo con i numeri di riga. La maggior parte delle entità della vita reale che numeriamo in serie partono da 1 - linee di autobus, posizioni pop chart, autostrade, voli, - nessuno di questi ha mai il numero 0.

0-based è l'eccezione, non la regola, ma ci sono alcuni ottimi motivi tecnici per cui li usiamo, il più importante è il fatto che l'aritmetica dei puntatori funziona in modo naturale, specialmente nei linguaggi di basso livello come C ( a[3] significa 'prendi l'indirizzo a e passa 3 celle in avanti', cioè *(a + 3) ).

    
risposta data 20.09.2011 - 09:29
fonte

Leggi altre domande sui tag