Ist das ->> ein alter Operator oder ein Tippfehler?

Lesezeit: 3 Minuten

Benutzeravatar von Seth Carnegie
Seth Carnegie

Im Laufe meiner Lektüre bin ich darauf gestoßen WG14 Fehlerbericht Nr. 51 geschrieben im Jahr 1993 (oder vielleicht 1893, sie haben das Jahrhundert und das Jahrtausend weggelassen). Im Codebeispiel wird dort anscheinend ein Operator geschrieben ->> wird für einen Zeiger auf a verwendet struct. Ich kann es in keiner Operator-Präzedenztabelle finden, die ich gefunden habe, also frage ich mich, ist oder war es jemals ein Operator, und wenn ja, was macht (oder tat) dieser Operator?

Zuerst dachte ich, es sei ein Tippfehler, aber es wird noch zweimal im Text und ein weiteres Mal im Codebeispiel in der Antwort auf die Frage wiedergegeben, und es fällt mir schwer zu glauben, dass es einfach an mindestens zwei C-Experten vorbeigerutscht ist, ohne es zu sein bemerkt, als es bei einem Neuling wie mir heraussprang. Es steht auch im Mittelpunkt des Codes, ist sehr leicht zu bemerken und wurde nie korrigiert.

Hier ist der Code mit hinzugefügter Einrückung:

#include <stdlib.h>

struct A {
    char x[1];
};

main()
{
    struct A *p = (struct A *) malloc(sizeof(struct A) + 100);
    p->>x[5] = '?';  /* This is the key line [for both them and us] */
    return 0;
}

Ich habe versucht, diesen Code sowohl mit einem C- als auch mit einem C++-Compiler zu kompilieren, und er konnte in keinem von beiden analysiert werden. Vielleicht war dies ein Operator in einer frühen Version von C, der nicht mehr verwendet wird?

Das fühlt sich verdächtig nach Wie heißt dieser Operator: “–>”? Frage, aber ich glaube nicht, dass dies eine Kombination aus zwei anderen Operatoren ist, ich sehe nicht, wie es aufgeteilt und gültig sein kann.

  • Ich habe das Gefühl, das ist ein Tippfehler.

    – R.Martinho Fernandes

    24. Oktober 2012 um 13:27 Uhr

  • @SethCarnegie: Ich stimme zu, dass es schwer zu glauben ist, aber ich finde es einfacher zu glauben, als dass 1993 C eine hatte ->> Betreiber seitdem an Historiker verloren. Dass Andrew Koenig ein Unsterblicher ist, der 1893 am Leben war und den C-Standard kommentierte, liegt irgendwo zwischen den beiden. Vielleicht hatte er einen Urgroßvater? 😉

    – Steve Jessop

    24. Oktober 2012 um 13:35 Uhr

  • Dieser Code ist einfach im Jahr 2093 geschrieben, also operator->> immer noch nicht erfunden.

    – Lol4t0

    24. Oktober 2012 um 13:43 Uhr

  • Wir sollten den Autor dieses SO-Beitrags fragen, wie er verwendet ->> 🙂

    – Halex

    24. Oktober 2012 um 13:51 Uhr

  • „Sobald Sie das Unmögliche eliminiert haben, muss das, was übrig bleibt, egal wie unwahrscheinlich es ist, die Wahrheit sein.“ -Arthur Conan Doyle

    – Adam Rosenfield

    24. Oktober 2012 um 14:07 Uhr

Es sieht nach einem Problem im Transkriptionsprozess aus. Es gibt ein ähnliches Problem in DR 42, wo das Größer-als-Zeichen verdoppelt wird: http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_042.html

Benutzeravatar von Graham Borland
Graham Borland

Ich habe C 1992 gelernt und bin mir zu 100 % sicher, dass es damals keinen solchen Operator gab.

Aus dem Kontext, p->>x[5]können wir daraus schließen, dass es genau dasselbe zu tun scheint wie der bekanntere Pfeiloperator, ->. Es handelt sich also wahrscheinlich um einen Tippfehler.


Alternativ könnte es sich um ein Codierungsproblem beim Transkribieren des Codes in HTML handeln. Wenn Sie sich die Quelle dieser Seite ansehen, können Sie sehen, dass sie eine seltsame Mischung aus Escape-Codes und Literal enthält < und > Figuren:

<TT><B>#include &lt;stdlib.h><BR>

  • Zweifel, siehe mein Kommentar

    – Seth Carnegie

    24. Oktober 2012 um 13:31 Uhr

  • Aktualisiert mit einer anderen möglichen Erklärung.

    – Graham Borland

    24. Oktober 2012 um 13:40 Uhr

  • Das ist viel mehr möglich. Aber es gibt keinen Grund, das Zeichen > zu codieren, und es gibt kein passendes <.

    – Seth Carnegie

    24. Oktober 2012 um 13:41 Uhr

  • 1993 waren HTML-kodierende Skripte sehr wahrscheinlich sehr kaputt.

    – Graham Borland

    24. Oktober 2012 um 13:42 Uhr

  • Wenn es sich um ein Codierungsproblem handelt, warum > in include ist nicht kaputt?

    – Lol4t0

    24. Oktober 2012 um 13:46 Uhr

Benutzeravatar von twol
zwöl

Dies scheint wahrscheinlich ein Transkriptionsfehler gewesen zu sein, aber ich denke, es wäre sowieso nützlich, aufzuschreiben, wie ein echter C-Compiler dieses Konstrukt interpretieren würde, nur um klarzustellen, dass es sich nicht um einen cleveren Trick handelt. Das erste, was wichtig zu wissen ist, ist dieser Satz aus C11 §6.5.4p4 (technisch gesehen N1570; diese Sprache ist seit C89 unverändert, obwohl die Abschnittsnummer wahrscheinlich anders war; Hervorhebung von mir):

Wenn der Eingabestrom bis zu einem bestimmten Zeichen in Vorverarbeitungstoken zerlegt wurde, ist das nächste Vorverarbeitungstoken das am längsten Zeichenfolge, die ein Vorverarbeitungstoken darstellen könnte.

Das bedeutet die sechsstellige Zeichenfolge " p->>x" muss als tokenisiert werden p -> > xnicht p - >> x oder p - > > x. (In diesem Fall ist es eigentlich egal, es wäre so oder so ein Syntaxfehler, aber diese Regel kann der Unterschied zwischen einem Programm-Parsing wie beabsichtigt sein und nicht; die Norm gibt das Beispiel x+++++ywas interpretiert wird als x++ ++ +ynicht so wie x++ + ++yobwohl nur letzteres ein wohlgeformter Ausdruck ist.)

Das nächste, was Sie wissen müssen, ist einfach, dass das rechte Argument von -> Operator muss ein sein Kennunggemäß den Grammatikregeln für Postfix-Ausdruck in §6.5.2. Offensichtlich > ist kein Bezeichner, also haben wir einen eindeutigen Syntaxfehler.

1409290cookie-checkIst das ->> ein alter Operator oder ein Tippfehler?

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

Privacy policy