Warum wurde das Prozentzeichen (%) als Formatbezeichner für die printf-Funktionsfamilie ausgewählt?

27

Jeder weiß, dass Sie zumindest in C die printfFunktionsfamilie zum Drucken einer formatierten Zeichenfolge verwenden. Und diese Funktionen verwenden ein Prozentzeichen ( %), um den Anfang eines Formatbezeichners anzugeben. Zum Beispiel %dbedeutet "Drucken" intund " %uDrucken" unsigned int. Wenn Sie mit der printfFunktionsweise und der Formatierung von Platzhaltern nicht vertraut sind oder einfach eine Auffrischung benötigen, ist der Wikipedia-Artikel ein guter Ausgangspunkt.

Meine Frage ist, gibt es einen besonders zwingenden Grund, warum dies ursprünglich als Formatspezifizierer gewählt wurde oder in Zukunft gewählt werden sollte?

Offensichtlich wurde die Entscheidung vor langer Zeit getroffen (sehr wahrscheinlich für einen Vorgänger der C-Sprache), und seitdem ist sie mehr oder weniger "Standard" (nicht nur in C, sondern auch in einer Vielzahl anderer Sprachen) haben ihre Syntax in unterschiedlichem Maße übernommen. Es ist also viel zu spät, um sie jemals zu ändern. Aber ich bin immer noch gespannt, ob jemand weiß, warum diese Wahl überhaupt getroffen wurde und ob es immer noch Sinn macht, eine neue Sprache mit ähnlichen Funktionen zu entwerfen.

Beispielsweise traf Microsoft mit C # (und der anderen Familie von .NET-Sprachen) eine etwas andere Entscheidung hinsichtlich der Funktionsweise der Zeichenfolgenformatierungsfunktionen. Obwohl dort ein gewisses Maß an Typensicherheit erzwungen werden kann (im Gegensatz zur Implementierung von printfin C) und daher keine Angabe des Typs des entsprechenden Parameters erforderlich ist , haben sie sich für die Verwendung von geschweiften Klammernpaaren mit Index Null entschieden ( {}). als Formatbezeichner wie folgt:

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.

Die Dokumentation für die String.FormatMethode enthält weitere Informationen, ebenso wie dieser Artikel zur Verbundformatierung im Allgemeinen , die genauen Details sind jedoch eher unwichtig. Der Punkt ist einfach, dass sie die langjährige Praxis %, den Beginn eines Formatspezifizierers anzugeben , aufgegeben haben . Die C-Sprache hätte einfach verwendet werden können {d}und {u}, aber das war nicht der Fall. Hat jemand irgendwelche Gedanken darüber, warum, ob diese Entscheidung im Nachhinein sinnvoll ist und ob neue Implementierungen folgen sollten?

Offensichtlich gibt es kein Zeichen, das ausgewählt werden könnte, ohne dass es ausgeblendet werden müsste, damit es in den String selbst aufgenommen werden kann, aber dieses Problem ist bereits durch die Verwendung von nur zwei davon ziemlich gut gelöst . Welche weiteren Überlegungen sind relevant?

Cody Gray
quelle
5
Das entstehende Problem wird nicht durch die Verwendung von zwei Zeichen gelöst. Es bedeutet nur, dass Sie noch einen Charakter haben, dem Sie entkommen können.
JJJ
2
Ich bin neugierig. Sicher wäre es möglich, {u}anstelle von zu verwenden, %uaber hätte es einen signifikanten Vorteil? Es scheint eine weitgehend willkürliche Wahl zu sein.
CB Bailey
12
@JarrodRoberson Sie sagen also, dass sie die {}Syntax absichtlich so gewählt haben, dass Leute, die C # lernen, nichts anderes lernen würden? Ich finde es sehr schwer zu glauben, dass dies ein wichtiger, wenn überhaupt ein Teil ihrer Designentscheidung war. Können Sie Ihre Aussage irgendwie sichern?
5.
6
Interessanterweise hat Python die %Formatierung (eine weit überlegene Form) zugunsten einer ähnlichen {}Formatierung wie .NET aufgegeben, da diese mehr Flexibilität bietet.
Konrad Rudolph
3
Warum ist der Himmel blau und warum heißt das Wort "blau" blau? Sie mussten etwas auswählen.

Antworten:

12

Wie @Secure feststellt, ist die printfFunktion von C von der Funktion von BCPL inspiriert writef. Wenn Sie sich die Wikipedia-Seite für BCPL ansehen , finden Sie ein Beispiel, das zeigt, dass BCPL writefauch verwendet wurde %, um einen Formatbezeichner einzuführen.

Daraus können wir schließen, dass C %entweder aufgrund von BCPL oder aus denselben Gründen wie BCPL verwendet wurde. Mein Bauchgefühl ist, dass es einfach %eines der am seltensten verwendeten ASCII-Zeichen ist ... so dachten die Autoren. Es ist auch wahrscheinlich, dass sie nicht viel Zeit damit verbracht haben, die verschiedenen Alternativen abzuwägen. Zu dieser Zeit waren sowohl BCPL als auch C obskure Sprachen, und die Autoren hatten höchstwahrscheinlich wichtigere Dinge zu erledigen.

Es ist jedoch ein kleiner Schraubenschlüssel in Arbeit. Während C von BCPL inspiriert wurde, ist nicht ganz klar, ob C BCPL-E / A-Bibliotheken ausgeliehen hat oder umgekehrt. Ich erinnere mich, dass die I / O-Bibliotheken von BCPL einen Evolutionsprozess durchliefen, als der Indexoperator für das Infix-Byte zur Sprache hinzugefügt wurde. (Eigentlich glaube ich zu wissen, wer davon wissen würde.)

Stephen C
quelle
3
"Eigentlich glaube ich zu wissen, wer davon wissen würde" ... und? ... und? .. Lass uns nicht mit einem
Klippenanhänger allein
2
@ Mawg - Brian Knight würde wahrscheinlich. Ian Wilson würde es wahrscheinlich tun. Martin Richards würde auf jeden Fall. HTH.
Stephen C
6

Der Wikipedia-Eintrag enthält nicht viele historische Informationen, die nicht spezifisch für printfZeichen sind, sondern nur, um Zeichen im Allgemeinen zu entkommen.

http://en.wikipedia.org/wiki/Escape_character

Eine frühe Bezugnahme auf den Begriff "Escape-Charakter" findet sich in Bob Bemers technischen Veröffentlichungen zu IBM. Anscheinend hat er diesen Mechanismus während seiner Arbeit am ASCII-Zeichensatz erfunden.

Meine Vermutung ist: Der Backslash wurde bereits für String-Literale verwendet und ein anderes Zeichen wurde für die Format-Strings benötigt. Höchstwahrscheinlich wählten sie den Charakter mit der angenommenen geringsten Häufigkeit der normalen Verwendung und des Auftretens.

Übrigens, ein anderer verwandter Artikel ist dort mit einem Begriff verknüpft, den ich schon einmal gehört habe:

http://en.wikipedia.org/wiki/Leaning_toothpick_syndrome

Der Artikel für printfhat einige mehr Info-Schnipsel, aber nicht über die Gründe.

http://en.wikipedia.org/wiki/Printf

Cs variadisches printf hat seinen Ursprung in der Writef-Funktion von BCPL.

Sichern
quelle