Kryptische Zeile “??!??!” im Legacy-Code [duplicate]

Lesezeit: 2 Minuten

Benutzer-Avatar
Benutzer2573221

Ich überarbeite einige sehr alter Legacy-Code, der voller Fehler und sehr fragwürdiger Praktiken ist, zumindest für moderne Standards. Jetzt bin ich auf eine Zeile gestoßen, die ich einfach nicht entziffern kann:

p und k sind vom Typ int *

return p??!??!k?p?*p:sizeof(*k):0;

Als ich es sah, traute ich meinen Augen nicht – ich kenne das ? Operator, aber seine Syntax ist bool ? trueresult : falseresult und ein ?? Operator macht weder Sinn (Lazy Evaluation trifft hier wirklich nicht zu), noch konnte ich irgendwo einen Hinweis auf diesen mysteriösen Operator finden.

Es wäre wirklich cool, wenn jemand etwas Licht in diese Angelegenheit bringen würde.

  • en.wikipedia.org/wiki/Digraphs_and_trigraphs#C

    – qrdl

    18. Juli 2013 um 8:26 Uhr

  • Welchen Compiler verwendest du? gcc ignoriert zum Beispiel standardmäßig Trigraphen. Und ja, das muss sein sehr, sehr alt Code, in der Tat.

    – devnull

    18. Juli 2013 um 8:29 Uhr

  • @devnull Es ist gcc, aber es ist mit einem Makefile kompiliert. Und jetzt, wo ich weiß, was Trigraphen sind, weiß ich auch, warum es ein gibt -trigraphs Flag an den Compiler übergeben 😉

    – Benutzer2573221

    18. Juli 2013 um 8:32 Uhr

  • Trigraphen (??!) sind böse; verkettete ternäre Operatoren (??::) sind auch böse; Beide in derselben Linie zu mischen ist zu viel!

    – rodrigo

    18. Juli 2013 um 8:52 Uhr

  • Das ist purer Müll. Ich gehe jetzt zur doppelten Frage, um diesen Kommentar auch dort hinzuzufügen.

    – Daniel Daranas

    18. Juli 2013 um 9:51 Uhr


Benutzer-Avatar
Yu Hao

Es heißt Trigraph:

C11 (ISO/IEC 9899:201x) §5.2.1.1 Trigraph-Sequenzen

Bevor irgendeine andere Verarbeitung stattfindet, wird jedes Vorkommen einer der folgenden Sequenzen von drei Zeichen (sogenannte Trigraph-Sequenzen17)) durch das entsprechende einzelne Zeichen ersetzt.

??=    #
??(    [
??/    \
??)    ]
??'    ^
??<    {
??!    |
??>    }
??-    ~

Es ist auch in C++11 (ISO/IEC 14882:2011) § 2.3 enthalten Trigraph-Sequenzen

Also nach dem Ersetzen des Trigraphen die Linie return p??!??!k?p?*p:sizeof(*k):0; verwandelt sich in

return p || k ? p ? *p : sizeof(*k) : 0

Da der ternäre Operator eine eher niedrige Präzedenz hat, ist es eigentlich:

return (p || k) ? (p ? (*p) : sizeof(*k)) : 0;

Benutzer-Avatar
Benutzer123

Diese Codezeile ist äquivalent zu:

return p || k? p? *p : sizeof(*k) : 0;

Oder deutlicher:

return (p || k)? (p? (*p) : sizeof(*k)) : 0;

1364300cookie-checkKryptische Zeile “??!??!” im Legacy-Code [duplicate]

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

Privacy policy