我正在重构一些非常旧的遗留代码,这些代码充满了错误和非常可疑的做法,至少对于现代标准而言。现在我跑过一条线,我根本无法破译:
p
和k
的类型为int *
return p??!??!k?p?*p:sizeof(*k):0;
当我看到它时,我无法相信自己的眼睛 - 我知道?
运算符,但其语法为bool ? trueresult : falseresult
且??
运算符无效(懒惰的评估确实这里不适用),我不能在任何地方找到那个神秘操作员的参考。
答案 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;