关于C++:??!??!的含义

Cryptic line “??!??!” in legacy code

本问题已经有最佳答案,请猛点这里访问。

我正在重构一些非常古老的遗留代码,其中充满了错误和非常可疑的实践,至少在现代标准中是这样。现在我跑过一条线,我根本无法破译:

pkint *型。

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

当我看到它的时候,我简直不敢相信自己的眼睛——我知道?操作符,但它的语法是bool ? trueresult : falseresult,而??操作符既没有意义(这里不适用懒惰的评估),我在任何地方都找不到那个神秘操作符的参考。

如果有人对这件事有所了解,那就太酷了。


它叫做三角图:

C11(ISO/IEC 9899:201X)§5.2.1.1三角图序列

Before any other processing takes place, each occurrence of one of the following
sequences of three characters (called trigraph sequences17)) is replaced with the
corresponding single character.

1
2
3
4
5
6
7
8
9
??=    #
??(    [
??/    \
??)    ]
??'    ^
??<    {
??!    |
??>    }
??-    ~

它也是在C++ 11(ISO/IEC 1488∶2011)中的2.3个三重序列。

因此,在更换三角图后,线return p??!??!k?p?*p:sizeof(*k):0;变成

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

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

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

这一行代码相当于:

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

或者更清楚地说:

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