Cryptic line “??!??!” in legacy code
本问题已经有最佳答案,请猛点这里访问。
我正在重构一些非常古老的遗留代码,其中充满了错误和非常可疑的实践,至少在现代标准中是这样。现在我跑过一条线,我根本无法破译:
1 | return p??!??!k?p?*p:sizeof(*k):0; |
当我看到它的时候,我简直不敢相信自己的眼睛——我知道
如果有人对这件事有所了解,那就太酷了。
它叫做三角图:
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个三重序列。
因此,在更换三角图后,线
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; |