Ligne cryptique"??!??!"dans le code hérité [dupliquer]

Cette question a déjà une réponse ici:

Je refactore certainstrès Vieux code hérité qui est plein de bugs et de pratiques très discutables, au moins pour les normes modernes. Maintenant, j'ai traversé une ligne que je ne peux tout simplement pas déchiffrer:

p et k sont de type int *

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

Quand je l'ai vu, Je ne pouvais pas en croire mes yeux - je connais l'opérateur ?, mais sa syntaxe est bool ? trueresult : falseresult et un opérateur ?? n'a aucun sens (l'évaluation paresseuse ne s'applique vraiment pas ici), Je ne pouvais pas trouver une référence de cet opérateur mystérieux n'importe où.

Ce serait vraiment cool si quelqu'un faisait la lumière sur cette question.

21
demandé sur Yu Hao 2013-07-18 12:24:10

2 réponses

Il s'appelle Trigraph :

C11(ISO/IEC 9899:201x) §5.2.1.1 séquences Trigraphiques

Avant tout autre traitement, chaque occurrence de l'un des éléments suivants les séquences de trois caractères (appelées séquences trigraphiques17)) sont remplacées par caractère unique correspondant.

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

C'est aussi en C++11 (ISO / IEC 14882:2011) § 2.3 séquences Trigraphiques

Donc, après le remplacement du trigraphe, la ligne return p??!??!k?p?*p:sizeof(*k):0; tourne dans

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

Puisque l'opérateur ternaire a une priorité plutôt faible, c'est en fait:

return (p || k) ? (p ? (*p) : sizeof(*k)) : 0;
37
répondu Yu Hao 2013-07-18 08:40:35

Cette ligne de code est équivalente à:

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

Ou plus clairement:

return (p || k)? (p? (*p) : sizeof(*k)) : 0;
6
répondu Mohamad Ali Baydoun 2013-07-18 08:33:15