神秘的线条“??!??!”在遗留代码中

时间:2013-07-18 08:24:11

标签: c++ c operators

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

pk的类型为int *

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

当我看到它时,我无法相信自己的眼睛 - 我知道?运算符,但其语法为bool ? trueresult : falseresult??运算符无效(懒惰的评估确实这里不适用),我不能在任何地方找到那个神秘操作员的参考。

如果有人对此事有所了解,那真是太酷了。

2 个答案:

答案 0 :(得分:37)

它被称为Trigraph

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

  

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

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

它也在C ++ 11(ISO / IEC 14882:2011)§2.3 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;

答案 1 :(得分:6)

该代码行相当于:

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

或者更清楚:

return (p || k)? (p? (*p) : sizeof(*k)) : 0;
相关问题