C++代码中`???-`的含义是什么?

67

我从一些遗留代码中看到了以下代码:

 size_t a = 1 ???- 2 :0;

???- 这个符号在 C++ 中是什么意思?我应该如何理解它?


7
“???”只能用于注释中。 :) - Mark Garcia
1
想出一个虚假含义给这个运算符应该很有趣。???-可以成为“真的吗???我震惊!”运算符,一个 ? 可以向编译器暗示第一个分支很少被执行。 - Patashu
12
必须提及WTF运算符:??!??! - chris
13
三字符组(trigraphs)存在的目的是为了解决两个问题。首先,一些嵌入式系统只支持非常有限的字符集,并且可能无法显示或输入像 "^" 和 "" 这样的字符。其次,一些操作系统支持多个代码页,其中对于“”、“^”、“|”等字符具有不同的编码。确保你的代码支持所有代码页变体的唯一方法是使用三字符组(看着你,IBM EBCDIC!)。 - James Anderson
6
@JamesAnderson 嵌入式系统?你在用什么药啊?三字符并不会影响程序的功能或目标系统。它们实际上只是源文件的字符编码,为那些键盘上没有特定键的用户提供了方便。IBM反对废弃三字符,据说是因为这样可以避免强制他们的大型机用户在EBCDIC文本编码上进行标准化。但是,大型机恰恰相反于嵌入式系统。 - Potatoswatter
显示剩余7条评论
3个回答

109

它实际上是:

size_t a = 1 ? ~2 :0;

??-trigraph 表示 ~


是来自一个旧时代的东西......甚至在我们有些人出生之前。

早些时候,有一些字符并不总是被支持。一个无知的程序员会尝试输入这样的字符,只发现它不存在于键盘上!

enter image description here
图片来源:http://www.myoldmac.net/cgi-data/forum/phpBB2/viewtopic.php?t=305

所以添加了以允许程序员在这些字符不存在(无论是在编码中还是从键盘上)时访问这些字符的功能。

现在,它们已经过时了,在混淆读者方面比绕过旧标准更有效。

所以要么那段代码真的很老,要么作者是个混蛋。


19
我支持选择 (b),作者行为十分讨厌。a = 1 ? ~2 : 0这段代码是对 a = ~2 的不必要的混淆写法。三目运算符的存在只是为了混淆代码。加入三重字符以掩盖波浪号更是锦上添花。 - David Hammen
2
“三字符集是来自旧时代的。” -- 三字符集是在1989年的ANSI C标准中添加到语言中的。它们从未被删除;2011年的ISO C标准仍然包含它们。 - Keith Thompson
6
如果作者不是个讨厌鬼,而该三字代码确实在那种情况下需要使用,那么为了更容易理解,应该将其写成 ? ??- 而不是 ???- - vsz
作为一个小附加说明:C++委员会标准计划在过去的5年中删除它们。然而,有一些反对意见,它们仍然存在。 - Morwenn
1
@vsz 实际上,我认为如果作者在意可读性的话,应该是 ? compl 2 而不是 ? ??- 2 - Ruslan
显示剩余2条评论

16

??-是代表波浪符号~的三字符组,该行与以下内容等效:

size_t a = 1 ? ~2 :0;

9

??-是代表波浪符~的三字符缩写。其他一些三字符缩写如下:

 ??= for #

??/ for \

??' for ^

??! for |

12
现在三字符组的使用非常罕见。- 在SO上没有相关内容。 - Mark Garcia
7
如果只考虑字符计数,我认为他们会选择使用~而不是??- - TankorSmash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接