C语言 – 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):

三字符序列允许输入未在ISO / IEC 646中描述的不变代码集中定义的字符,ISO / IEC 646是七位US ASCII代码集的子集。


那么,为什么这一般存在可能与你的例子中存在的原因不同。

这一切都始于半个世纪前,将硬拷贝通信终端重新用作计算机用户界面。在最初的Unix和C时代,那是ASR-33电传打字机。

这个设备很慢(10 cps),噪音和丑陋,它的ASCII字符集视图以0x5f结束,因此它(仔细观察图片)没有任何键:

{ | } ~ 

定义三字母以解决特定问题。我们的想法是,C程序可以使用ASR-33上的ASCII子集以及缺少高ASCII值的其他环境。

你的例子实际上是两个??!,每个意思|,所以结果是||

然而,几乎按照定义编写C代码的人有现代设备1,所以我的猜测是:有人炫耀或自娱自乐,在代码中留下一种复活节彩蛋供你找。

它确实有效,它导致了一个广受欢迎的SO问题。

添加评论

友情链接:蝴蝶教程