Jeder kann seine eigenen Operatoren in C “deklarieren”. 😉
Weitere Fragen zum Rätseln:
Wie werden diese Operationen in C99 durchgeführt? gcc? …
Und warum wurden /\ & \/ weggelassen?
Für welche Typen waren die Operatoren /\ und \/ gültig?
Googeln nach “/\ \/” bringt natürlich nichts zurück. Wikipedia hat weder für /\ noch für \/ eine Seite. Aber ich habe entdeckt, dass ähnliche Operatoren in die XML-Zeicheneinheiten eingebaut sind!
Quelle hinzugefügt: Ich habe das beleidigende Beispiel in der cc-Quelldatei “c00.c” des PDP gefunden:
/*
* Return the next symbol from the input.
* peeksym is a pushed-back symbol, peekc is a pushed-back
* character (after peeksym).
* mosflg means that the next symbol, if an identifier,
* is a member of structure or a structure tag or an enum tag
*/
symbol()
{
...
case BSLASH:
if (subseq("https://stackoverflow.com/", 0, 1))
return(MAX);
goto unkn;
case DIVIDE:
if (subseq('\\', 0, 1))
return(MIN);
if (subseq('*',1,0))
return(DIVIDE);
...
}
Mir ist … nicht bekannt, dass diese Zeichenpaare jemals eine Bedeutung in C hatten. was lässt Sie glauben, dass sie es getan haben?
– Brian Postow
8. Oktober 2009 um 22:40 Uhr
die logischen Symbole AND und OR ?
– Nick Dandoulakis
8. Oktober 2009 um 22:51 Uhr
Wo im Code hast du das gesehen? Könntest du ein paar Zeilen teilen?
– Dirk Vollmar
8. Oktober 2009 um 23:07 Uhr
Interessant! Es sieht also plausibel aus für ‘a = b /\ c;‘ um a das Maximum von b und c zuzuweisen, und ‘a = b \/ c;‘ das Minimum zu tun. Und damals war es wahrscheinlich, dass die moderne ‘+=‘ Operatoren wurden noch geschrieben als ‘=+‘ und waren tatsächlich zwei Token, also die hypothetische ‘a =/\ b;‘ wäre der max-assignment-Operator gewesen usw. Faszinierend!
– Jonathan Leffler
8. Oktober 2009 um 23:57 Uhr
+1 für die interessanteste Frage, auf die ich gestoßen bin und die wie eine der albernsten aussah. Ich hatte noch nie zuvor von diesen Operatoren gehört – wenn sie nur hängen geblieben wären, wären uns jahrelange Kopfschmerzen erspart geblieben, wenn wir uns mit beschissenen MIN/MAX-Makros auseinandersetzen müssten, die Operanden zweimal auswerten.
– Michael Burr
9. Oktober 2009 um 5:25 Uhr
Weder /\ noch / sind im ISO C89-Standard als Operatoren definiert, und ich glaube nicht, dass sie jemals in einer früheren Version definiert wurden. Und soweit ich weiß, sind sie definitiv nicht in C99 definiert.
(Sie sind wahrscheinlich Opfer einer seltsamen arkanen Präprozessormagie)
+1 für seltsame arkane Präprozessormagie. Das sieht so aus, wie man es in einem IOCCC-Eintrag sehen könnte.
– Chris Lutz
8. Oktober 2009 um 22:45 Uhr
Sinan Ünür
\/ sieht aus wie sup und /\ sieht aus wie inf. Das könnten sie auch sein ∨ und ∧beziehungsweise.
Ich kann mich nicht erinnern, diese jemals in der 2. Auflage von K&R oder einem anderen C-Buch gesehen zu haben.
Das erinnert mich an das veraltete ? (min und max)-Operatoren und ihre Zuweisungsvarianten ?=, die G++ früher erlaubte und auf die ich unglücklicherweise gestoßen bin.
“Das Internet” sagt, dass das Zeichen \ von ‘Bob Bemer’ zu ASCII hinzugefügt wurde, um die Operatoren /\ und \/ zu ermöglichen. vgl home.ccil.org/~remlaps/www.bobbemer.com/BRACES.HTM – Vielleicht werden manchmal – auch heute noch – MIN und MAX mit bedenklichen Seiteneffekten in C implementiert: zB #define MIN(a,b) ((a
– NevilleDNZ
9. Oktober 2009 um 1:51 Uhr
Nur neugierig – warum wurden die Begriffe “sup” und “inf” anstelle von “max” und “min” verwendet, was ich für die sofort verständlicheren halten würde? Die verlinkten Seiten, die ‘Supremum’ und ‘Infimum’ beschreiben, machen mir Kopfschmerzen.
– Michael Burr
17. Oktober 2009 um 17:22 Uhr
Jonathan Leffler
Spekulation!
Wenn Sie Leerzeichen um sie herum haben, dann:
a /\ b ===> a / b
a \/ b ===> a / b
Logik: Die Vorverarbeitungsphase muss sich mit Backslash und einem Zeichen danach befassen und behandelt Backslash-Leerzeichen sehr wahrscheinlich als Leerzeichen und Backslash-Slash als Schrägstrich.
Allerdings lehnen sowohl der SUN-C-Compiler (Version 12) als auch der GNU-C-Compiler (Version 4.4) Code ab, der den umgekehrten Schrägstrich enthält. Aber ich könnte leicht glauben, dass alte C-Präprozessoren vor dem Standard weniger sorgfältig damit umgegangen sind.
Einhaltung von Standards
Die Operatoren waren noch nie Teil einer offiziellen Version von C.
Außerdem würde der Standard die von mir gegebene Interpretation nicht zulassen (Abschnitt 5.1.1.2 Übersetzungsphasen, sowohl in C89 als auch in C99) – aber Nicht-Standard-Compiler sind natürlich nicht durch den Standard eingeschränkt.
Hinzugefügt, nachdem die Quelle gepostet wurde:
Interessant! Es sieht also plausibel aus für ‘a = b /\ c;‘ um a das Maximum von b und c zuzuweisen, und ‘a = b \/ c;‘ das Minimum zu tun (oder, wie Greg Hewgill betonte, eher umgekehrt). Und damals war es wahrscheinlich, dass die moderne ‘+=‘ Operatoren wurden noch geschrieben als ‘=+‘ und waren tatsächlich zwei Zeichen (keine unterstützenden Beweise für diese Behauptung; wieder Gedächtnisschwäche), also das hypothetische ‘a =/\ b;‘ (oder in moderner Notation ‘a /\= b;‘) wäre der Max-Assignment-Operator gewesen usw.
Ich bin mir nicht sicher \/aber /\ ist ein gültiges Konstrukt. Es wird verwendet, um die beiden Schrägstriche eines einzeiligen Kommentars in getrennten Zeilen zu platzieren. Zum Beispiel:
/\
/ Comment content
Dies funktioniert, weil der Backslash dem Zeilenumbruch entgeht und der Parser fortfährt, als wäre er nicht vorhanden. Dies funktioniert nicht, wenn nach dem umgekehrten Schrägstrich ein Leerzeichen steht oder wenn der zweite Schrägstrich eingerückt ist. Aus diesem Grund ist es möglich, so viele Zeilenumbrüche zu maskieren, wie Sie möchten, wie in
/\
\
\
\
\
/ Still a legal comment.
Backslashes können auch am Ende von regulären einzeiligen Kommentaren verwendet werden, um sie in die nächste Zeile fortzusetzen, wie in
// Yet another comment \
This line is in the comment \\
And so is this one!
C hat diese Operatoren nie gehabt.
Typischerweise wäre / in einigen String-Systemen ein Escape-Code, nicht sicher, ob /\ jemals eine Bedeutung hatte.
Jerry Sarg
Ich bezweifle, dass sie jemals etwas bedeutet haben. Wenn sie es jemals taten, dann war es ein lang Zeit vor. Die einzigen mir bekannten großen Operatoren, die aus C entfernt wurden, waren =+ und =-, die frühe Synonyme für += und -= waren. Vielleicht möchten Sie sich die DMRs ansehen Urzeitliche C-Seite für Beweise.
Quintus
Ich vermute, dass dies ein Hinweis auf die formale symbolische Logik ist:
Mir ist … nicht bekannt, dass diese Zeichenpaare jemals eine Bedeutung in C hatten. was lässt Sie glauben, dass sie es getan haben?
– Brian Postow
8. Oktober 2009 um 22:40 Uhr
die logischen Symbole
AND
undOR
?– Nick Dandoulakis
8. Oktober 2009 um 22:51 Uhr
Wo im Code hast du das gesehen? Könntest du ein paar Zeilen teilen?
– Dirk Vollmar
8. Oktober 2009 um 23:07 Uhr
Interessant! Es sieht also plausibel aus für ‘
a = b /\ c;
‘ um a das Maximum von b und c zuzuweisen, und ‘a = b \/ c;
‘ das Minimum zu tun. Und damals war es wahrscheinlich, dass die moderne ‘+=
‘ Operatoren wurden noch geschrieben als ‘=+
‘ und waren tatsächlich zwei Token, also die hypothetische ‘a =/\ b;
‘ wäre der max-assignment-Operator gewesen usw. Faszinierend!– Jonathan Leffler
8. Oktober 2009 um 23:57 Uhr
+1 für die interessanteste Frage, auf die ich gestoßen bin und die wie eine der albernsten aussah. Ich hatte noch nie zuvor von diesen Operatoren gehört – wenn sie nur hängen geblieben wären, wären uns jahrelange Kopfschmerzen erspart geblieben, wenn wir uns mit beschissenen MIN/MAX-Makros auseinandersetzen müssten, die Operanden zweimal auswerten.
– Michael Burr
9. Oktober 2009 um 5:25 Uhr