Ligne cryptique"??!??!"dans le code hérité [dupliquer]
Cette question a déjà une réponse ici:
- Qu'est-ce que le C ??!??! l'opérateur n'? 4 réponses
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.
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;
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;