我从一些遗留代码中看到了以下代码:
size_t a = 1 ???- 2 :0;
???-
这个符号在 C++ 中是什么意思?我应该如何理解它?
它实际上是:
size_t a = 1 ? ~2 :0;
??-
是 trigraph 表示 ~
早些时候,有一些字符并不总是被支持。一个无知的程序员会尝试输入这样的字符,只发现它不存在于键盘上!
图片来源:http://www.myoldmac.net/cgi-data/forum/phpBB2/viewtopic.php?t=305
所以添加了以允许程序员在这些字符不存在(无论是在编码中还是从键盘上)时访问这些字符的功能。
现在,它们已经过时了,在混淆读者方面比绕过旧标准更有效。
所以要么那段代码真的很老,要么作者是个混蛋。
a = 1 ? ~2 : 0
这段代码是对 a = ~2
的不必要的混淆写法。三目运算符的存在只是为了混淆代码。加入三重字符以掩盖波浪号更是锦上添花。 - David Hammen? ??-
而不是 ???-
。 - vsz? compl 2
而不是 ? ??- 2
。 - Ruslan??-
是代表波浪符号~
的三字符组,该行与以下内容等效:
size_t a = 1 ? ~2 :0;
??-
是代表波浪符~
的三字符缩写。其他一些三字符缩写如下:
??= for #
??/ for \
??' for ^
??! for |
~
而不是??-
。 - TankorSmash
???-
可以成为“真的吗???我震惊!”运算符,一个?
可以向编译器暗示第一个分支很少被执行。 - Patashu" 这样的字符。其次,一些操作系统支持多个代码页,其中对于“”、“^”、“|”等字符具有不同的编码。确保你的代码支持所有代码页变体的唯一方法是使用三字符组(看着你,IBM EBCDIC!)。 - James Anderson