协慌网

登录 贡献 社区

什么是 C ??!??!操作员呢?

我看到一行 C 看起来像这样:

!ErrorHasOccured() ??!??! HandleError();

它编译正确,似乎运行正常。看起来它正在检查是否发生了错误,如果有错误,它会处理它。但我不确定它在做什么或者它是如何做的。看起来程序员正试图表达他们对错误的看法。

我从来没有见过??!??!在使用任何编程语言之前,我无法在任何地方找到它的文档。 (谷歌没有帮助搜索条件,如??!??! )。它做了什么以及代码示例如何工作?

答案

??!是一个翻译为|三字符 。所以它说:

!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 问题。

ASR-33电传打字机

ASR-33 电传打字机


1. 就此而言,三角形是由 ANSI 委员会发明的,它 C 成功失败首次遇到,因此原始的 C 代码或编码器都不会使用它们。

这是一个 C 三连词??!| ,所以??!??!是运算符||