This question already has answers here:
What does the ??!??! operator do in C?

(4个答案)


7年前关闭。




我正在重构一些的旧遗留代码,这些代码充满了错误和非常可疑的做法,至少对于现代标准而言是如此。现在,我碰到了一条我根本无法解读的线:
pk的类型为int *
return p??!??!k?p?*p:sizeof(*k):0;

当我看到它时,我不敢相信自己的眼睛-我知道?运算符,但是它的语法是bool ? trueresult : falseresult,而??运算符没有任何意义(懒惰的评估在这里实际上不适用),我找不到该神秘运算符的引用任何地方。

如果有人对此事有所了解,那真的很酷。

最佳答案

它称为Trigraph:

C11(ISO/IEC 9899:201x)§5.2.1.1Trigraph序列


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

它也在C++ 11(ISO/IEC 14882:2011)§2.3 Trigraph序列中

因此,在替换了Trigraph之后,return p??!??!k?p?*p:sizeof(*k):0;行变成了
return p || k ? p ? *p : sizeof(*k) : 0

由于三元运算符的优先级较低,因此实际上是:
return (p || k) ? (p ? (*p) : sizeof(*k)) : 0;

关于c++ - 遗留代码中的密码行 “??!??!” ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17718286/

10-12 15:58