Pet*_*son 1911 c operators trigraphs
我看到一行C看起来像这样:
!ErrorHasOccured() ??!??! HandleError();
Run Code Online (Sandbox Code Playgroud)
它编译正确,似乎运行正常.看起来它正在检查是否发生了错误,如果有错误,它会处理它.但我不确定它在做什么或它是如何做的.看起来程序员正试图表达他们对错误的看法.
我从来没有??!??!
在任何编程语言中看过以前,我无法在任何地方找到它的文档.(Google对搜索字词没有帮助??!??!
).它做了什么以及代码示例如何工作?
use*_*653 1541
??!
是一个翻译为的三字母|
.所以它说:
!ErrorHasOccured() || HandleError();
Run Code Online (Sandbox Code Playgroud)
由于短路,相当于:
if (ErrorHasOccured())
HandleError();
Run Code Online (Sandbox Code Playgroud)
本周的大师(处理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代码集的子集.
Dig*_*oss 435
那么,为什么这一般存在可能与你的例子中存在的原因不同.
这一切都始于半个世纪前,将硬拷贝通信终端重新用作计算机用户界面.在最初的Unix和C时代,那是ASR-33电传打字机.
这个设备很慢(10 cps),噪音和丑陋,它的ASCII字符集视图以0x5f结束,因此它(仔细观察图片)没有任何键:
{ | } ~
Run Code Online (Sandbox Code Playgroud)
定义三字母以解决特定问题.我们的想法是,C程序可以使用ASR-33上的ASCII子集以及缺少高ASCII值的其他环境.
你的例子实际上是两个
??!
,每个意思|
,所以结果是||
.
然而,几乎按照定义编写C代码的人有现代设备1,所以我的猜测是:有人炫耀或自娱自乐,在代码中留下一种复活节彩蛋供你找.
它确实有效,它导致了一个广受欢迎的SO问题.
ASR-33电传打字机
Jim*_*ard 138
如前所述??!??!
实际上是两个三合(??!
和??!
捣成泥再一起),其被替换翻译到||
,即逻辑或,由预处理器.
以下包含所有三字母的图像应该有助于消除替代三字母组合的歧义:
(图片取自C:A参考手册第5版)
所以,看起来像一个三字符??(??)
最终将映射到[]
,??(??)??(??)
将被替换[][]
等等,你的想法.
由于在预处理过程中替换了三字符,您可以使用cpp
一个愚蠢的trigr.c
程序来自己获取输出视图:
Trigraph Replaces
??( [
??) ]
??< {
??> }
??/ \
??' ^
??= #
??! |
??- ~
Run Code Online (Sandbox Code Playgroud)
并处理它:
void main(){ const char *s = "??!??!"; }
Run Code Online (Sandbox Code Playgroud)
你将得到一个控制台输出
cpp -trigraphs trigr.c
Run Code Online (Sandbox Code Playgroud)
您可以注意到,-trigraphs
必须指定该选项,否则cpp
将发出警告; 这表明卦是如何成为过去的事物而且没有现代价值,除了混淆可能碰到它们的人.
至于引入三元组背后的基本原理,在查看以下历史部分时,可以更好地理解??!??!
:
ISO/IEC 646及其前身ASCII(ANSI X3.4)在很大程度上支持了有关电信行业字符编码的现有做法.
由于ASCII没有提供除英语之外的语言所需的许多字符,因此制作了许多国家变体,用一些较少使用的字符替换了所需的字符.
(强调我的)
因此,从本质上讲,某些必需的角色(存在三角形的角色)在某些国家变体中被替换.这导致使用由其他变体仍然存在的字符组成的三字符的替代表示.
归档时间: |
|
查看次数: |
251618 次 |
最近记录: |