遗留代码中的神秘行"??!??!"

Cryptic line "??!??!" in legacy code

本文关键字:代码      更新时间:2023-10-16

我正在重构一些非常古老的遗留代码,这些代码充满了错误和非常可疑的做法,至少对于现代标准而言。现在我遇到了一条我根本无法破译的行:

pk属于int *类型

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

当我看到它时,我简直不敢相信自己的眼睛 - 我知道?运算符,但它的语法bool ? trueresult : falseresult??运算符既没有意义(懒惰计算在这里真的不适用(,我无法在任何地方找到那个神秘运算符的参考。

如果有人对此事有所了解,那将非常酷。

被称为Trigraph:

C11(ISO/IEC 9899:201x( §5.2.1.1 三元组序列

在进行任何其他处理之前,每次出现以下情况之一 三个字符的序列(称为三元组序列17(替换为 对应的单个字符。

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

它也在C++11(ISO/IEC 14882:2011(§ 2.3 三元组序列中

所以更换三元组后,线return p??!??!k?p?*p:sizeof(*k):0;变成

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

由于三元运算符的优先级相当低,因此实际上是:

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

这行代码等效于:

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

或者更清楚:

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