我看到一行 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 电传打字机
这是一个 C 三连词 。 ??!
是|
,所以??!??!
是运算符||