Perché il linguaggio C originale non supportava le dichiarazioni iniziali nelle inizializzazioni del ciclo?Razionale per pre-C99 C che non ha dichiarazioni iniziali in cicli for?
Ovviamente i creatori originali, e quindi le standardizzazioni pre-C99, non lo hanno specificato in questo modo. Ma non riesco a trovare alcuna motivazione per perché che la scelta di progettazione è stata fatta.
La cosa più vicina ad una risposta mi sembra di trovare è this answer spiegando come le dichiarazioni e il codice di miscelazione è stata vietata al fine di consentire per i compilatori di essere single-passano indietro quando questo era importante. A prima vista ha senso che le dichiarazioni in una dichiarazione di ciclo avessero problemi identici o simili a quelli delle dichiarazioni mescolate con il codice.
Ma, pre-C99 C fatto dichiarazioni di sostegno alla partenza dei blocchi:
{
unsigned int i;
for(i = 0; i < WHATEVER; i += 1)
{
/* ... */
}
}
Io personalmente non vedo come la logica compilatore per che è sostanzialmente diverso da quello per questo:
for(unsigned int i = 0; i < WHATEVER; i += 1)
{
/* ... */
}
Mi sembra che se un compilatore può eseguire l'ex passaggio singolo, potrebbe fare anche quest'ultimo. Potrebbe richiedere che una dichiarazione for
sempre crei un blocco di ambito (anche se seguito da una sola istruzione e non da un blocco di istruzioni { ... }
), ma non riesco a pensare a un modo per tale semantica di rompere qualsiasi altro pre-C99 Codice C (l'istruzione for è seguita da un blocco nel qual caso è già "ambito", oppure è seguito da una singola istruzione, nel qual caso una nuova dichiarazione non sarebbe stata comunque consentita in quella singola istruzione).
Quindi, perché questa "funzione" di sintassi è stata inizialmente omessa? Ho sbagliato a pensare che sarebbe stato banale sostenerlo senza violare gli obiettivi di prestazione del tempo? Le tecniche del parser/compilatore conosciute al momento hanno fatto sembrare più difficile? È stato omesso solo a causa del design minimalista/mentalità, dal momento che funzionalmente era possibile fare la stessa cosa (bloccarsi per loop)? Oppure c'era un motivo esplicito di design del linguaggio contro di esso (ad esempio, come inizialmente Go escludeva le eccezioni perché i progettisti pensavano che fosse fatto per una lingua migliore)?
Dove Ho guardato
- Ho cercato di trovare una risposta a questo qui e attraverso general web-search-fu, senza fortuna: tutti i termini di ricerca ho pensato di sembrano essere saturo di confuso domande sulle dichiarazioni iniziali di C for loop, sul messaggio di errore "usato al di fuori della modalità C99", ecc. (eccetto il termine di ricerca "razionale", che mi ha guidato a informazioni utili, ma nulla che abbia risposto in modo specifico).
- Ho cercato su this article da Dennis Ritchie stesso sullo sviluppo della lingua, e non ho notato nulla.
- Ho cercato attraverso la mia copia di The C Programming Language (2a edizione), prima leggendo la sezione di spiegazione del loop effettivo, quindi controllando l'indice per altre menzioni di "for"/"for loop". Ho letto un paio di altri posti che pensavo potessero dirlo, ma non ho trovato nulla.
Prima di C99, C non consentiva di definire le variabili tranne all'inizio di un blocco. Le variabili definite nella parte di controllo di un ciclo 'for' non erano all'inizio di un blocco, quindi non c'era alcuna aspettativa che fossero supportate. Il C++ ha introdotto entrambi i concetti (definendo le variabili ovunque in un blocco e le variabili definite nella parte di controllo di un 'for' loo) - e C99 ha aggiunto anche loro. –
Le uniche persone che possono rispondere a questo sono gli autori, chiunque altro sta solo speculando. Questi tipi di domande sono considerati fuori tema. – cimmanon
@JonathanLeffler Ho upvoted il tuo commento. Pensi che sarebbe meglio incorporato nella risposta attualmente data? È simile al concetto "non aggiungere funzionalità a meno che i programmatori non si fermino dall'ottenere qualcosa" nella risposta, ma coglie un modo leggermente diverso di considerare il problema. – mtraceur