it-swarm.com.de

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

Jeder weiß, dass Sie zumindest in C die Funktionsfamilie printf verwenden, um eine formatierte Zeichenfolge zu drucken. Und diese Funktionen verwenden ein Prozentzeichen (%), Um den Beginn eines Formatbezeichners anzuzeigen. Zum Beispiel bedeutet %d Das Drucken eines int und %u Das Drucken eines unsigned int. Wenn Sie mit der Funktionsweise der printf -Funktion und des Formats 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 Formatbezeichner 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), so dass es viel zu spät ist, sich jemals zu ändern. Aber ich bin immer noch neugierig, ob jemand einen Einblick hat, warum diese Wahl überhaupt getroffen worden sein könnte und ob es als Wahl immer noch sinnvoll ist, eine neue Sprache mit ähnlichen Funktionen zu entwerfen.

Beispielsweise hat Microsoft mit C # (und der anderen Familie von .NET-Sprachen) eine etwas andere Entscheidung hinsichtlich der Funktionsweise der Zeichenfolgenformatierungsfunktionen getroffen. Obwohl dort ein gewisses Maß an Typensicherheit erzwungen werden kann (im Gegensatz zur Implementierung von printf in C) und es daher nicht erforderlich ist, eine Angabe des Typs des entsprechenden Parameters anzugeben, haben sie sich für die Verwendung von Null-Index entschieden Paare von geschweiften Klammern ({}) 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.Format - Methode enthält weitere Informationen, ebenso wie dieser Artikel zur zusammengesetzten Formatierung im Allgemeinen , aber die genauen Details sind eher unwichtig. Der Punkt ist einfach, dass sie die langjährige Praxis aufgegeben haben, % Zu verwenden, um den Beginn eines Formatbezeichners anzuzeigen. Die C-Sprache hätte leicht {d} Und {u} Verwenden können, aber das tat es nicht. Hat jemand irgendwelche Gedanken darüber, warum, ob diese Entscheidung im Nachhinein sinnvoll ist und ob neue Implementierungen folgen sollten?

Natürlich kann kein Zeichen ausgewählt werden, das nicht entkommen kann, damit es in die Zeichenfolge selbst aufgenommen werden kann, aber dieses Problem ist bereits durch die Verwendung von zwei von ihnen recht gut gelöst . Welche anderen Überlegungen sind relevant?

27
Cody Gray

Wie @Secure feststellt, ist die Funktion printf von C von der Funktion writef von BCPL inspiriert. Und wenn Sie auf der Wikipedia-Seite nach BCPL suchen, zeigt ein Beispiel, dass BCPL writef auch % Verwendet hat. um einen Formatbezeichner einzuführen.

Wir können also schließen, dass C % Verwendet hat, entweder weil BCPL es getan hat oder aus den gleichen Gründen wie BCPL. Mein Bauchgefühl ist, dass es einfach war, dass % Eines der am wenigsten verwendeten ASCII Zeichen ...) ist, dachten die Autoren. Es ist auch wahrscheinlich, dass sie es nicht getan haben. ' t verbringen viel Zeit damit, 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. Obwohl C von BCPL inspiriert wurde, ist nicht ganz klar, ob C BCPL-E/A-Bibliotheken ausgeliehen hat oder umgekehrt. Ich erinnere mich nur schwach daran, dass die E/A-Bibliotheken von BCPL einen Evolutionsprozess durchlaufen haben, als der Infix-Byte-Indexierungsoperator der Sprache hinzugefügt wurde. (Eigentlich glaube ich zu wissen, wer davon wissen würde.)

12
Stephen C

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

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

Ein früher Hinweis auf den Begriff "Fluchtcharakter" findet sich in den technischen Veröffentlichungen von Bob Bemer zu IBM. Anscheinend hat er diesen Mechanismus während seiner Arbeit am Zeichensatz ASCII) 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 des normalen Gebrauchs und Auftretens.

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

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

Der Artikel für printf enthält einige weitere Info-Snippets, jedoch nicht die Gründe.

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

Cs variadic printf hat seinen Ursprung in der Schreibfunktion von BCPL.

6
Secure