Was _haben_ die C-Operatoren /\ und \/ gemacht?

Lesezeit: 2 Minuten

Benutzer-Avatar
NevilleDNZ

Jeder kann seine eigenen Operatoren in C “deklarieren”. 😉

Weitere Fragen zum Rätseln:

  1. Wie werden diese Operationen in C99 durchgeführt? gcc? …
  2. Und warum wurden /\ & \/ weggelassen?
  3. 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);
...
}


Tatsächliche Implementierungen:
Die Operatoren /\ und \/ gehen bis zurück Sechste Ausgabe Unix 1975 (bisher). Beispiele: Unix V6(1975), Unix V7(1979) und aktueller BSD 2.11(1992-2008)

  • 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.

Hier ist ein Entwurf des ANSI C89-Standards als Referenz: http://flash-gordon.me.uk/ansi.c.txt

(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

Benutzer-Avatar
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.

    – Joey Adams

    9. Oktober 2009 um 0:06 Uhr

  • Sie haben wahrscheinlich richtig geraten: Ich habe Implementierungen der /\- und \/-Operatoren in Unix V6 und V7 gefunden. (bitsavers.org/bits/Interdata/32bit/unix/univWollongong_v6/… & stuff.mit.edu/afs/sipb/project/v7unix/fs/usr/src/cmd/c/c00.c). Ich scheine, dass K&R vergessen hat, /\ und \/ zu dokumentieren, als sie das Alte Testament geschrieben haben. Jetzt muss ich nur noch wissen, wo TH Wollongong ist? 😉

    – NevilleDNZ

    9. Oktober 2009 um 0:31 Uhr

  • @NevilleDNZ Gute Arbeit. Sehen maps.google.com/…

    – Sinan Ünür

    9. Oktober 2009 um 0:59 Uhr

  • “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

Benutzer-Avatar
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.

Mir fällt auch ein, dass Thompsons ACM-Turing-Award-Rede ‘Reflexionen über Vertrauen Vertrauen“ ist irgendwie relevant.

  • Wenn jemand dies in einem Code tut, den ich pflegen muss, hätte er verdammt noch mal besser den Staat verlassen …

    – TED

    8. Oktober 2009 um 22:54 Uhr

  • @TED ​​- was ist mit dem Aufteilen von / und * eines Kommentars über mehrere Zeilen mit Backslash-Newline?

    – Jonathan Leffler

    8. Oktober 2009 um 23:22 Uhr

  • \/ zum sup und /\` for inf` sind etablierte mathematische Schreibweisen. Siehe auch en.wikipedia.org/wiki/Lattice_%28order%29

    – Sinan Ünür

    9. Oktober 2009 um 2:32 Uhr

Benutzer-Avatar
Cristián Romo

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.

Benutzer-Avatar
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.

Benutzer-Avatar
Quintus

Ich vermute, dass dies ein Hinweis auf die formale symbolische Logik ist:

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

/ wird verwendet, um eine Disjunktion (ODER) anzuzeigen /\ wird (weniger häufig) verwendet, um eine Konjunktion (AND) anzuzeigen

1385240cookie-checkWas _haben_ die C-Operatoren /\ und \/ gemacht?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy