遗留代码中的神秘行"??!??!"
Cryptic line "??!??!" in legacy code
本文关键字:代码 更新时间:2023-10-16
我正在重构一些非常古老的遗留代码,这些代码充满了错误和非常可疑的做法,至少对于现代标准而言。现在我遇到了一条我根本无法破译的行:
p
和k
属于int *
类型
return p??!??!k?p?*p:sizeof(*k):0;
当我看到它时,我简直不敢相信自己的眼睛 - 我知道?
运算符,但它的语法bool ? trueresult : falseresult
,??
运算符既没有意义(懒惰计算在这里真的不适用(,我无法在任何地方找到那个神秘运算符的参考。
如果有人对此事有所了解,那将非常酷。
它
被称为Trigraph:
C11(ISO/IEC 9899:201x( §5.2.1.1 三元组序列
在进行任何其他处理之前,每次出现以下情况之一 三个字符的序列(称为三元组序列17(替换为 对应的单个字符。
??= #
??( [
??/
??) ]
??' ^
??< {
??! |
??> }
??- ~
它也在C++11(ISO/IEC 14882:2011(§ 2.3 三元组序列中
所以更换三元组后,线return p??!??!k?p?*p:sizeof(*k):0;
变成
return p || k ? p ? *p : sizeof(*k) : 0
由于三元运算符的优先级相当低,因此实际上是:
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++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值