什么是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电传打字机

ASR-33电传打字机


1.对于这个问题,trigraphs是由ANSI委员会发明的,它在C成为一个失控的成功后首次遇到,所以原始的C代码或编码器都不会使用它们。


这是一个C trigraph。 ??!| ,所以??!??! 是运营商||

链接地址: http://www.djcxy.com/p/209.html

上一篇: What does the C ??!??! operator do?

下一篇: What are the basic rules and idioms for operator overloading?