什么是C ??!??! 运营商呢?
我看到一行C看起来像这样:
!ErrorHasOccured() ??!??! HandleError();
它编译正确,似乎运行正常。 它似乎在检查是否发生了错误,如果有,它会处理它。 但我不确定它究竟在做什么或者它是如何做的。 它看起来像程序员正在试图表达他们对错误的感受。
我从来没有见过??!??!
之前使用任何编程语言,我无法在任何地方找到文档。 (Google对搜索字词没有帮助,例如??!??!
)。 它做什么以及代码示例如何工作?
??!
是翻译为|
的三元组 。 所以它说:
!ErrorHasOccured() || HandleError();
由于短路,这相当于:
if (ErrorHasOccured())
HandleError();
本周大师(处理C ++,但在这里相关),我选择了这一点。
三字母的可能来源或@DwB在评论中指出,更可能由于EBCDIC(再次)很困难。 这个关于IBM developerworks板的讨论似乎支持这一理论。
根据ISO / IEC 9899:1999§5.2.1.1,脚注12(h / t @ Random832):
trigraph序列允许输入未在不变代码集中定义的字符,如ISO / IEC 646中所述,它是7位US ASCII代码集的子集。
那么,为什么这存在一般可能不同于它为什么存在于你的例子。
这一切都开始于半个世纪之前,将硬拷贝通信终端重新用作计算机用户界面。 在最初的Unix和C时代是ASR-33 Teletype。
这个设备很慢(10 cps),噪音和丑陋,它的ASCII字符集的视图结束于0x5f,所以它(仔细看图片)没有任何关键:
{ | } ~
trigraphs被定义为解决特定的问题。 这个想法是C程序可以使用ASR-33上找到的ASCII子集以及其他缺少高ASCII值的环境。
你的例子其实是两个??!
,每个含义|
,所以结果是||
。
但是,编写C代码的人几乎是按照定义有了现代化的设备,所以我的猜测是:有人炫耀或者玩弄自己,在代码中留下一种复活节彩蛋供你查找。
它确实有效,它导致了一个非常流行的SO问题。
ASR-33电传打字机
1.对于这个问题,trigraphs是由ANSI委员会发明的,它在C成为一个失控的成功后首次遇到,所以原始的C代码或编码器都不会使用它们。
这是一个C trigraph。 ??!
是|
,所以??!??!
是运营商||
上一篇: What does the C ??!??! operator do?
下一篇: What are the basic rules and idioms for operator overloading?