Warum war das Leerzeichen nicht gewählt für C++14-stellige Separatoren?
Als von C++14, Dank n3781 (die in sich selbst keine Antwort auf diese Frage) vielleicht schreiben wir einen code wie den folgenden:
const int x = 1'234; //one thousand two hundred and thirty four
Ziel ist die Verbesserung der code wie dieser:
const int y = 100000000;
und machen es besser lesbar.
Den Unterstrich (_
) Charakter war bereits im C++11, die durch benutzerdefinierte Literale, und das Komma (,
) hat die Lokalisation Probleme — viele Europäische Länder verblüffend† verwenden Sie diese als Dezimaltrennzeichen und Konflikte mit dem Komma-operator, obwohl ich Frage mich, was die real-world-code könnte möglicherweise gebrochen worden, indem z.B. 1,234,567
.
Sowieso eine bessere Lösung zu sein scheint, die dem Raum Charakter:
const int z = 1 000 000;
Diese angrenzenden numerischen literalen Token können verkettet werden, indem der Präprozessor nur so sind string-Literale:
const char x[5] = "a" "bc" "d";
Statt, wir bekommen das Apostroph ('
), die nicht von jedem system schreiben, ich bin mir dessen bewusst, als eine Ziffer separator.
Gibt es einen Grund, dass der Apostroph gewählt wurde statt eines einfachen Raum?
† Es ist unverständlich, da alle diese Sprachen, die im text an, pflegen Sie die Vorstellung von einem Komma, "zerreißen" einem sonst atomaren Satz mit einem Punkt funktionieren "kündigen" der Satz — für mich zumindest, dies ist ganz Analog zu einem Komma "auseinander bricht" den ganzzahligen Teil einer Zahl und einem Punkt "beenden" ist es bereit für die Bruch-Eingang.
- In Bezug auf das Komma, ist das nicht das Problem der Komma-operator, sondern als Lokalisierungs-Probleme?
- Da schlage ich vor in der Frage, obwohl dies mag wahr sein, kann ich mir nicht vorstellen, dass es eine real-world-code, der tatsächlich gebrochen wurde, durch solch einen Konflikt. Wer schreibt
1,000,000
und könnte erwarten, etwas anderes als die Verkettung derjenigen, Literale, in der Realität? Der nächste, den ich bekommen kann, istfoo()*3, 4, 5
aber ich denke, erfordern Klammern um den ersten Ausdruck zumutbar ist. Weil es albern code in den ersten Platz. - Ah, ich vergaß ein paar Worte. Ich hab meine für die Hälfte-Satz kurz-Adresse der Komma-operator.
- Ich so oft zu hören, dass "whitespace ist egal!" oder "wird ignoriert!" - wäre schön wenn das ein bißchen wahrer!
- Ich nehme an, niemand ändern soll die Bedeutung von
int a[] = {123,000,000}
. Für das Komma versus Zeitraum Unterscheidung, beachten Sie, dass diese vor kurzem standardisiert - sowohl in text und zahlen. - Autsch, das ist ein gutes Beispiel. re ", das kürzlich standardisierte" was meinst du? Ich bin mir nicht bewusst jede Sprache, die sich verändert hat in den letzten Speicher, und sicherlich nicht erst seit 1998.
- Ich meinte eigentlich Ihre Verwendung in der Sprache geschrieben, die zufällig im 19.Jahrhundert.
- Richtig, das ist, warum ich bin verwirrt, als die Relevanz der Tatsache, dass, weil der 19th Jahrhundert, etwas älter als C++.
- Der Kommentar wurde in Bezug auf die Fußnote und nicht-englischen Sprachen. Die Frist war bereits im Einsatz als Gruppen-Trennzeichen in Datumsangaben, z.B.
IV.I.MMXV
heute ist. - Ich interpretiere das anders als du. Diese Fristen betragen in der Abgrenzung der drei unterschiedlichen Bereichen (als der Zeitraum, in Englisch
123.45
grenzt integral und fractional); dies ist eine andere Funktion hat als das gedient, Tausender-Trennzeichen, die rein ästhetische, sondern als semantische im Einsatz. Als solche, Ihre würde-werden Gegenbeispiel ist nur ein weiteres Beispiel, warum das moderne Englisch Komma als Tausender-Trennzeichen sinnvoll ist (über die Verwendung einer Frist für die selbe Sache) und hat getan, da vor dem 19. 🙂 - Es gibt keinen "Sinn" davon. Dezimal-Trennzeichen ist sicherlich nicht vollständig zum Stillstand gekommen ist; mit einem Komma würde wahrscheinlich die meisten "vernünftigen". Aber diese sind rein Schriftsatz-Konventionen, die im Laufe der Zeit entwickelt, unterschiedlich in den verschiedenen "locales", und als MSalters Punkte heraus, nur standardisierte vor kurzem.
- Der 1800er ist wohl kaum "vor kurzem", obwohl ich zugeben, dass solche Dinge relativ sind.
- Neben der technischen Punkte, die Sie sagen, dass das Apostroph ('), [ist] nicht von jedem system schreiben, ich bin mir dessen bewusst, als eine Ziffer separator. Es ist ein Land, mit dem Apostroph als digit separator: Schweiz. Ich habe auch gesehen, dass es in Fällen, in denen der Autor liebt es mehr oder ein Punkt/Komma würde zu Verwirrung führen, da Sie International unterschiedlich verwendet.
- Wenn das macht Sie fühlen sich besser, ich bin Europäer und Dank der vielen Produkte, die hergestellt in den usa (Taschenrechner, etc.) mit Komma für dezimal-Werte ist - glücklicherweise - sehr langsam Herausfallen Geschmack. Ich würde sagen, 0.99 ist jetzt allgemein verwendet als 0,99; mit Kommas als Trennzeichen für Tausender ist unbekannt, obwohl, wie durch Punkte, die wir gerade nicht trennen lassen (wahrscheinlich, weil 1,234 und 1.234 beides bedeutet Dezimalzahlen heute)
- Bezüglich der Verwendung des Kommas als Trennzeichen, könnte man überlegen, was (1,200) bedeutet -- es könnte bedeuten, 1200 oder 200, je nachdem, was Sie wollen, es zu Lesen, wenn das Komma verwendet, als Tausendertrennzeichen. Wieder, wie @AndreasBonini schreibt, dass es nicht verwendet werden, die oft in Europa.
- Es tut sich etwas 😉
- Ich hätte gedacht, das Problem mit dem Komma wäre die Mehrdeutigkeit im Falle von
int foo(int);int foo(int,int); foo(1,000);
- Gut, wir brauchen nur ein Unicode-Zeichen, das bedeutet insbesondere Ziffer Gruppierung.
- Und einen entsprechenden Alternativen-Token-Repräsentation (digraph)! 😀
- Für den Datensatz, der Apostroph ist standard digit separator notation auf Rechenmaschinen. (Verweis)
- Nicht alle von Ihnen. Es gibt keine "standard".
- Das ist der erste, den ich gesehen habe, ohne Apostrophe, und Google-Bilder-Suche scheint zu zeigen, die überwiegende Mehrheit der Verwendung. Zumindest ist es verantwortlich, die als gemeinsame Verwendung in solchen Maschinen, wenn wir vermeiden wollen wählerisch Wörter wie "standard".
- Aus einem cursor Suche auf
adding machine
es sieht mehr aus wie halbe/halbe, nicht "die überwiegende Mehrheit". - Lettland zu verwendet ein Apostroph als Tausendertrennzeichen - oder zumindest so getan haben, als ich noch in der Schule. 😛 Es ist nicht etwas, die Sie Häufig verwenden.
- Es ist eine große Beitrag auf der UX-Website, entnommen aus Wikipedia, zeigt, dass die Nutzung von Separatoren für verschiedene Länder. Wie es oft der Fall mit der Internationalisierung, es gibt mehr Varianten, als man erwarten würde, und es ist ziemlich viel Durcheinander! 🙂
- Kommas kann geringer sein, Separatoren in Englisch geschrieben, aber algebraische Ausdrücke dots sind oft Optional platziert lediglich zu klären, die Grenzen zwischen dem Token, in der Erwägung, dass das Komma verwendet wird, trennen zwei unterschiedliche Elemente in einem paar. Betrachten
a·sin(A)
das ist das gleiche wiea(sin(A))
, in der Erwägung, dassv = (2,3)
ist sehr Verschieden vonv = (2(3))
. Trotzdem, logischen Ressourcen, um Präzedenzfall zu wählen zwischen Lokalisierungen nie wirklich geben uns die richtige Antwort. - Wahr genug.
- In Bezug auf real-world-code mit Komma-operator zwischen den zahlen:
Eigen::Matrix3f m; m << 1,2,3,4,5,6,7,8,9;
. Siehe Eigen ist Komma-Initialisierung. - Aber das ist eigentlich eine verkettete Reihe von Funktionsaufrufen (jeweils mit einem
Eigen
Typ auf der LHS) und könnte definiert werden, um Vorrang vor einer "single" literal gefunden in einem Teilausdruck auf seine eigenen. Logisch die beiden unterschieden werden konnte, aber, zugegeben, es ist sonst nicht eindeutig, und die parsing-Phase können nicht wollen, zu haben, um zu arbeiten, aus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine frühere Papier, n3499, die uns sagen, dass, obwohl Bjarne selbst vorgeschlagen Leerzeichen als Trennzeichen:
Ich denke, das folgende Beispiel ist das größte problem festgestellt:
obwohl meiner Meinung nach diese Begründung ist ziemlich schwach. Ich kann immer noch nicht glauben, eine real-world-Beispiel, um Sie zu brechen.
Den "Bearbeitungs-tools" Begründung ist sogar noch schlimmer, da
1'234
Pausen grundsätzlich jede syntax-highlighter, die der Menschheit bekannt (z.B. das von Markdown in der obigen Frage selbst!) und aktuelle Versionen der besagten Textmarker viel schwieriger zu implementieren.Immer noch, für besser oder schlechter, das ist die Begründung, dass führte zu der Annahme Apostrophe statt.
const int x = 0x123 a45;
. Beachten Sie, dass im Gegensatz zu den string-Falla45
ist nicht noch ein literal.0x123 a45
eine einzige, wenn auch-multi-token-literal. Können Sie denken Sie an ein Szenario, in dema45
interpretiert als Teil eines integer-literal, die hier nicht erwünscht? Es gibt keinen Betreiber oder alles, bevor es so was sonst noch könnte es jemals sein?#define abc + 1
,const int x = 0x123 abc;
abc
als id, aber dann müsstest du angeben, eine Art Verkettung von einem pp-Zahl und id, das ist...seltsam. Außerdem gibt es anscheinend auch erhebliche Bedenken mit dem brechen von Objective-C.x
undq
als temporäre "metaprogramming" von Makros (undef ' ed sofort nach Gebrauch), wenn es nötig war, um zu definieren, Daten-Tabellen, die kombiniert verschiedenen bit-Werte verschoben. Ich glaube nicht, dass ich verwendet habe, a-f, in solcher Mode, aber ich glaube nicht, dass ich ganz bewusst vermied Sie, so ist es plausibel, dass ein Programmierer benutzen könnte, metaprogramming Makros, die mit diesen Zeichen beginnen, wodurch Mehrdeutigkeit.<<6) | (uint64)(
, und man könnte produzieren einige Tabellen mit Dingen wieV(12 x 12 y 5 z)
. Solche Makros könnte mehrdeutig sein, wenn Sie enthalten Buchstaben von a-f, oder wenn Sie eine leere erscheinen konnte zwischen den Zeichen der0x
Präfix.DEADBEEF
ist wahrscheinlich nicht unangemessen makro name heute. In dem gegenwärtigen system, die zumindestDEADBEEF
kann niemals eine Zahl ohne0x
#define
'd Dinge wieGOOD
(als etwas willkürlich),BAD
(als etwas willkürlich), und irgendwo da unten ist eine Zahl, die0xBAD BAD
? (bitte nicht Sinn der Großschreibung - es könnte jeder sein)Der offensichtliche Grund für die Verwendung von white space ist, dass eine neue Zeile ist auch
ein Leerzeichen ist, und dass C++ behandelt alle weißen Raum identisch. Und aus
hand, ich kenne keine Sprache, die akzeptiert beliebige Leerzeichen
als Trennzeichen.
Vermutlich Unicode-0xA0 (non-breaking space) verwendet werden könnte,—es ist
die am meisten verbreitete Lösung, wenn Satz. Ich sehe zwei Probleme mit
jedoch: Erstens, er ist nicht in der basic-Zeichensatz, und zweitens,
es ist optisch nicht unterscheidungskräftig; Sie kann nicht sehen, dass es nicht ein Raum von
schauen Sie einfach nur auf den text in einem normalen editor.
Darüber hinaus, gibt es nicht viele Möglichkeiten. Sie können nicht das Komma verwenden, da
das ist bereits eine juristische token (und so etwas wie
1,234
ist derzeitRechtsanwälte C++, mit der Bedeutung 234). Und in einem Kontext, wo Sie auftreten könnten
in der juristischen code, z.B.
a[1,234]
. Ich kann zwar nicht Recht vorstellen, jede echtecode tatsächlich mit diesem, ist es eine grundlegende Regel, dass keine rechtlichen Programm,
unabhängig davon, wie absurd, sollte lautlos ändern Semantik.
Ähnliche überlegungen bedeuten, dass
_
können nicht verwendet werden; wenn es einen#define _234 * 2
, danna[1_234]
würden leise Veränderung der Bedeutung vondie code.
Kann ich nicht sagen, ich bin besonders zufrieden mit der Wahl von
'
, aber eshat den Vorteil, dass Sie verwendet in kontinental-Europa, zumindest in
einige Arten von Texten. (Ich glaube mich zu erinnern gesehen zu haben, es in Deutsch für die
Beispiel, obwohl in typischen running text, Deutsch, wie die meisten anderen
Sprachen, verwenden Sie einen Punkt oder ein non breaking space. Aber vielleicht war es auch
Schweizer Deutsch.) Das problem mit
'
Analyse; die Reihenfolge'1'
istschon juristisch ist
'123'
. So etwas wie1'234
könnte ein1
,gefolgt von dem start einer Zeichenkonstante; ich bin nicht sicher, wie weit Sie
zu look-ahead, um die Entscheidung zu treffen. Es gibt keine Folge von gesetzlichen
C++, in welche eine Integrale Konstante sein kann, gefolgt von einem Zeichen,
Konstante, es gibt also kein problem mit dem brechen legal code, aber es bedeutet,
das lexikalische Scannen wird plötzlich sehr Kontext abhängig.
(Mit Bezug auf dein Kommentar: es gibt keine Logik in der Auswahl eines
Dezimalstellen oder Tausender-Trennzeichen. Dezimal-Trennzeichen, zum Beispiel, ist
sicherlich nicht eine Vollbremsung. Sie sind nur willkürliche Konventionen.)
1,234
? Dass der jeweils gültigen bedeutet nicht, dass seine nützlich. MSalters' Beispiel eines array-Initialisierung war ziemlich gut, obwohl. Für still changing Semantik generell, aber dort ist Präzedenzfall dafür, wo das Dienstprogramm erheblich übersteige den ist use-cases (auto
als das offensichtlichste Beispiel).void f(int); void f(int, int); f(12,345);
a[1_234]
leise geändert, wieder keine, da Makros bereits verarbeitet zwei Phasen der übersetzung vor die Bühne führt, dass die string-Verkettung (wo ich erwarten würde, das wörtlich "Verkettung", um auch stattfinden).'123'
legal?Vom wiki, haben wir ein schönes Beispiel:
Hier haben wir die
.
operator und dann, wenn ein anderer Betreiber würde erfüllt werden, meine Augen würde warten, bis etwas sichtbar ist, wie ein Komma oder etwas, das nicht ein Leerzeichen.So ein Apostroph funktioniert hier wesentlich besser als ein Leerzeichen machen würde.
Mit Leerzeichen wäre es
die fühlt sich nicht mehr so Recht, wie der Fall mit der Apostrophe.
In dem gleichen Geist der Albert Renshaw Antwort, ich denke, dass das Apostroph ist klarer als der Raum der Leichtigkeit Rennen im Orbit schlägt.
Raum ist für viele Dinge verwendet, wie die Saiten Verkettung der OP erwähnt, im Gegensatz zu dem Apostroph, der in diesem Fall macht es klar, für jemanden, der verwendet wird, trennen Sie die Ziffern.
Wenn die Zeilen-code werden viele, ich denke, dass dies die Lesbarkeit verbessern, aber ich bezweifle, dass ist der Grund, warum Sie es wählen.
Über die Räume, die es vielleicht lohnt sich ein Blick auf das C Frage, die sagt:
Die Sprache nicht erlauben
int i = 10 000;
(ein integer-literal ist ein token, das dazwischenliegende Leerzeichen, spaltet es sich in zwei Token), aber es gibt in der Regel wenig bis gar keine Kosten, die entstehen, indem man die Initialisierung als ein Ausdruck, der eine Berechnung von literalen:int i = 10 * 1000; /* ten thousand */
10*1000
Beispiel nicht funktioniert.Es ist wahr, ich sehe keine praktische Bedeutung zu:
also Ziffern könnten zusammengeführt werden, ohne wirkliche Zweideutigkeit
aber was ist mit einer hexadezimalen Zahl?
Gibt es keine Möglichkeit, eindeutig machen von ein Tippfehler dabei (normalerweise sollte eine Fehlermeldung angezeigt werden)
Ich würde davon ausgehen, es ist, weil, während das schreiben von code, wenn Sie erreichen das Ende einer "Zeile" (die Breite des Bildschirms) einen automatischen Zeilenumbruch (oder "Wort-wickeln Sie") Auftritt. Dies würde bewirken, dass der int-Wert zu bekommen, in zwei Hälften geteilt, die eine Hälfte würde in der ersten Zeile, die zweite Hälfte auf den zweiten... so es bleibt alles zusammen im Falle eines
word-wrap
.Kommentieren tut nicht weh:
Binär-strings kann hart sein, zu analysieren:
Einem makro für die Prüfung:
Es hat damit zu tun, wie die Sprache wird analysiert. Es wäre schwierig gewesen, für die compiler-Autoren zu umschreiben, Ihre Produkte zu akzeptieren Leerzeichen getrennte Literale.
Auch, ich glaube nicht, Trenn-stellig mit Leerzeichen, ist sehr verbreitet. Ich habe gesehen, es ist immer nicht-whitespace-Zeichen, sogar in verschiedenen Ländern.
12'345'678
(Ziffer Separatoren) in die binäre form ist ungefähr das gleiche wie ohne Ziffer Separatoren. Es nimmt die gleiche Menge an Aufwand für den compiler-Autor. In der Erwägung, dass die Neudefinition der tokenisierung-system selbst wäre schwierig gewesen. Plus Leerzeichen getrennte zahlen, hässlich zu sein.["foobar"] ["frob"]
wird["foobarfrob]
. Oder der Segmentierer erweitert werden konnte, zu absorbieren Räume:decimal_literal ::= [1-9][0-9]+[uU]?(l|L|ll|LL)?
wirddecimal_literal ::= [1-9][ 0-9]+[uU]?(l|L|ll|LL)?
, in welchem Fall die wörtliche muß normalisiert werden später. Es ist im Grunde die gleiche Betriebsart wie für'
. Nicht sicher, was Sie wirklich wollen, um zu sagen 😐