Jeder weiß, dass Sie zumindest in C die printf
Funktionsfamilie zum Drucken einer formatierten Zeichenfolge verwenden. Und diese Funktionen verwenden ein Prozentzeichen ( %
), um den Anfang eines Formatbezeichners anzugeben. Zum Beispiel %d
bedeutet "Drucken" int
und " %u
Drucken" unsigned int
. Wenn Sie mit der printf
Funktionsweise 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 printf
in 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.Format
Methode 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?
{u}
anstelle von zu verwenden,%u
aber hätte es einen signifikanten Vorteil? Es scheint eine weitgehend willkürliche Wahl zu sein.{}
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?%
Formatierung (eine weit überlegene Form) zugunsten einer ähnlichen{}
Formatierung wie .NET aufgegeben, da diese mehr Flexibilität bietet.Antworten:
Wie @Secure feststellt, ist die
printf
Funktion von C von der Funktion von BCPL inspiriertwritef
. Wenn Sie sich die Wikipedia-Seite für BCPL ansehen , finden Sie ein Beispiel, das zeigt, dass BCPLwritef
auch 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.)
quelle
Der Wikipedia-Eintrag enthält nicht viele historische Informationen, die nicht spezifisch für
printf
Zeichen sind, sondern nur, um Zeichen im Allgemeinen zu entkommen.http://en.wikipedia.org/wiki/Escape_character
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
printf
hat einige mehr Info-Schnipsel, aber nicht über die Gründe.http://en.wikipedia.org/wiki/Printf
quelle