Perché il segno di percentuale (%) è stato scelto come identificatore di formato per la famiglia di funzioni printf?

27

Tutti sanno che, almeno in C, si utilizza la famiglia di funzioni printf per stampare una stringa formattata. E queste funzioni utilizzano un simbolo di percentuale ( % ) per indicare l'inizio di un identificatore di formato. Ad esempio, %d significa stampare un int e %u significa stampare un unsigned int . Se non hai familiarità con il funzionamento e la formattazione di printf dei segnaposto, o se hai semplicemente bisogno di un aggiornamento, l'articolo di Wikipedia è un buon punto di partenza.

La mia domanda è, c'è una ragione particolarmente convincente per cui questo è stato originariamente o dovrebbe essere scelto in futuro come identificatore di formato?

Ovviamente la decisione è stata presa molto tempo fa (molto probabilmente per un predecessore anche del linguaggio C), ed è stato più o meno "standard" da allora (non solo in C, ma anche in una vasta gamma di altre lingue che hanno adottato la sua sintassi a vari livelli), quindi è troppo tardi per cambiare. Ma sono comunque curioso di sapere se qualcuno abbia qualche idea sul perché questa scelta possa essere stata fatta in primo luogo e se abbia ancora senso come scelta se si sta progettando una nuova lingua con funzionalità simili.

Ad esempio, con C # (e l'altra famiglia di linguaggi .NET), Microsoft prese una decisione leggermente diversa riguardo al funzionamento delle funzioni di formattazione delle stringhe. Sebbene un certo grado di sicurezza del tipo possa essere applicato lì (diversamente dall'implementazione di printf in C), e quindi non è necessario includere un'indicazione del tipo del parametro corrispondente, hanno deciso di utilizzare coppie di ricci a indice zero parentesi graffe ( {} ) come specificatori di formato, ad esempio:

string output = String.Format("In {0}, the temperature is {1} degrees Celsius.",
                              "Texas", 37);
Console.WriteLine(output);

// Output:
//     In Texas, the temperature is 37 degrees Celsius.

La documentazione per il metodo String.Format contiene ulteriori informazioni, come questo articolo sulla formattazione composita in generale , ma i dettagli esatti non sono importanti. Il punto è semplicemente che hanno abbandonato la prassi consolidata di usare % per indicare l'inizio di un identificatore di formato. Il linguaggio C avrebbe potuto facilmente usare {d} e {u} , ma non lo fece. Qualcuno ha qualche idea sul perché, se questa decisione ha senso in retrospettiva, e se le nuove implementazioni dovrebbero seguirla?

Ovviamente non è possibile scegliere un personaggio che non debba essere sfuggito in modo che possa essere incluso nella stringa stessa, ma quel problema è già abbastanza risolto usando semplicemente due di loro. Quali altre considerazioni sono rilevanti?

    
posta Cody Gray 05.08.2012 - 08:21
fonte

2 risposte

12

Come note @Secure, la funzione printf di C è ispirata alla funzione writef di BCPL. E se guardi la pagina di wikipedia per BCPL , c'è un esempio che mostra che BCPL writef ha anche usato % per introdurre uno specificatore di formato.

Quindi possiamo dedurre che C ha usato % sia perché BCPL ha fatto, sia per gli stessi motivi che ha fatto BCPL. Il mio istinto è che era semplicemente che % è uno dei caratteri ASCII meno comunemente usati ... o almeno così pensavano gli autori. È anche probabile che non abbiano trascorso molto tempo a soppesare le varie alternative. A quel tempo, sia BCPL che C erano lingue oscure e gli autori probabilmente avevano cose più importanti da affrontare.

Tuttavia, c'è una chiave minore in lavorazione. Mentre C è stato ispirato da BCPL, non è del tutto chiaro se la C ha preso in prestito librerie I / O BCPL o viceversa. Ricordo vagamente che le librerie di I / O della BCPL hanno attraversato un processo di evoluzione sul tempo in cui l'operatore di indicizzazione dei byte infisso è stato aggiunto alla lingua. (In realtà, penso di sapere chi lo saprebbe.)

    
risposta data 05.08.2012 - 18:26
fonte
6

La voce di Wikipedia non contiene molte informazioni storiche, non specifiche per printf , ma per sfuggire ai caratteri in generale.

link

Early reference to the term "escape character" is found in Bob Bemer's IBM technical publications. Apparently, it is he who invented this mechanism, during his work on the ASCII character set.

La mia ipotesi è: la barra rovesciata era già stata utilizzata per le stringhe letterali e un altro carattere era necessario per le stringhe di formato. Molto probabilmente hanno scelto il personaggio con la minima frequenza presunta di utilizzo normale e occorrenza.

A proposito, un altro articolo correlato è collegato lì con un termine che ho sentito prima:

link

L'articolo per printf ha altri snippet di informazioni, ma non i motivi.

link

C's variadic printf has its origins in BCPL's writef function.

    
risposta data 05.08.2012 - 10:15
fonte

Leggi altre domande sui tag