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

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

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

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


#1楼

如前所述??!??! 本质上是两个三元组??!??!再次)组合在一起,被替换 - 翻译为|| 预处理器,即逻辑OR

包含每个三字母的下表应该有助于消除替代三字母组合的歧义:

Trigraph   Replaces??(        [
??)        ]
??<        {
??>        }
??/        \
??'        ^
??=        #
??!        |
??-        ~

资料来源: C:参考手册第5版

所以看起来像??(??)的三元组最终将映射到[]??(??)??(??)将被[][]等替换,你得到了这个想法。

由于在预处理期间替换了三字符,您可以使用cpp自己获取输出视图,使用一个愚蠢的trigr.c程序:

void main(){ const char *s = "??!??!"; }

并处理它:

cpp -trigraphs trigr.c

你将得到一个控制台输出

void main(){ const char *s = "||"; }

您可以注意到,必须指定选项-trigraphs ,否则cpp将发出警告; 这表明卦是如何成为过去的事物而且没有现代价值,除了混淆可能碰到它们的人


至于引入三字母的基本原理,在查看ISO / IEC 646的历史部分时可以更好地理解:

ISO / IEC 646及其前身ASCII(ANSI X3.4)在很大程度上支持了有关电信行业字符编码的现有做法。

由于ASCII没有提供除英语之外的语言所需的许多字符,因此制作了许多国家变体,用一些较少使用的字符替换了所需的字符

(强调我的)

因此,从本质上讲,某些必需的角色(存在三角形的角色)在某些国家变体中被替换。 这导致使用由其他变体仍然存在的字符组成的三字符的替代表示。


#2楼

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

!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代码集的子集。


#3楼

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


#4楼

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

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

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

{ | } ~

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

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

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

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

ASR-33电传打字机


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

什么是C ??!??!操作员呢?相关推荐

  1. AI一分钟|Uber撤裁100名无人车操作员;京东金融将融资130亿人民币

    ▌自动驾驶测试不顺,Uber 裁掉 100 名无人车操作员 据科技博客 TechCrunch 北京时间 7 月 12 日报道,打车应用 Uber 已经在美国旧金山和匹兹堡裁掉了大约 100 名自动驾驶 ...

  2. 计算机操作员中级操作试题,中级计算机操作员应知模拟考试试题(一)

    中级计算机操作员应知模拟考试试题(一) 中级计算机操作员应知模拟考试试题(一) 一.是非判断题(正确的打"√",错误的打"╳",每小题1分,共20分) (1)电 ...

  3. 计算机操作员高级理论试题答案,计算机操作员高级理论试题答案1.doc

    计算机操作员高级理论试题答案1 计算机操作员高级理论试题答案()一.?填空题(共15项空格,每空1分,共15分) 1.?调用Word助手的快捷键是? ??. 2.目前常见的网络操作系统主要有Netwa ...

  4. 8 .5 .5 创建操作员

    操作员是接收有关SQL Server代理作业和警报的通知的对象.操作员可以代表一个人, 也可以代表一个组.操作员没有与数据库或服务器主体关联,但独占SQL Server代理服务. 在本章前面的部分中, ...

  5. 计算机操作员考评标准,计算机操作员职业技能鉴定标准.doc

    计算机操作员职业技能鉴定标准 计算机操作员职业技能鉴定标准 ? 一.职业概况 1.1 职业名称:计算机操作员 1.2 职业定义:使用电子计算机微机从事文字.图形.图像等信息处理工作及计算机系统操作,维 ...

  6. 计算机操作鉴定所需设备,计算机操作员职业技能鉴定标准(高级)

    计算机操作员职业技能鉴定标准 一.职业概况 1.1 职业名称:计算机操作员 1.2 职业定义:使用电子计算机微机从事文字.图形.图像等信息处理工作及计算机系统操作,维护与管理的人员. 1.3 职业等级 ...

  7. stm32 火灾自动报警及联动控制源码_中级消防设施操作员关键技能之十四:能测试火灾自动报警系统联动功能...

    点击蓝字 关注我们 中级消防设施操作员关键技能 之十四: 能测试火灾自动报警系统联动功能 火灾报警控制器和消防联动控制器的设置要求 01 1.火灾报警控制器和消防联动控制器,应设置在消防控制室内或有人 ...

  8. 中职高级计算机操作员,计算机操作员专业排行榜

    计算机操作员专业排行榜,学校师资力量较强,管理团队和师资团队均为引进国内知名汽车专修院校人才,采用先进的现代化汽车检测与与维修的教学方法,实现理论与实训教学. 计算机操作员专业排行榜, 可考取计算机- ...

  9. 建立SQL Server警告和给操作员发送email通知

    数据库邮件 首先建立数据库邮箱具有一个叫做SQLAlerts的profile.这个profile可以以任何名称来命名,但是在这些指导中,引用的是profile名称SQLAlerts.如果你想用一个不同 ...

  10. 计算机操作员实操高级试题,计算机操作员高级实操(以往考过,可做平时练习素材)答题.doc...

    试题1.计算机安装.连接.调试 试题2.文字录入 b)中文基本录入:在十分钟之内录入以下中文内容,错误率不高于千分之三. c)公式录入:在文档的结尾处录入下列公式. d)完成以上操作后,将最终结果以& ...

最新文章

  1. excel甘特图模板_类似这样的甘特图是怎么做的?
  2. Windows 11 预览版泄露!有 macOS 那味儿了......
  3. 项目管理利器taiga快速安装
  4. containers文件夹可以删除吗_电脑进行C盘清理,appdata文件夹可以删除吗?
  5. JVM—垃圾回收与算法
  6. 简单谈谈Server2008的NAP到底是什么
  7. 字符串、对象、数组操作方法、json方法
  8. bzoj 1083: [SCOI2005]繁忙的都市
  9. 机器学习之熵【从定义到代码】
  10. 21天java基础入门总结
  11. Lingo11 解决优化问题( 下载和运行 )
  12. 阿里云域名转入/转出操作教程
  13. ZigBee模块(DL-20)在调试过程中的问题及解决方案
  14. MySQL-- 统计函数
  15. 基于labview的虚拟简单信号发生器
  16. activex服务器与com组件,COM和ActiveX控件设计.ppt
  17. matlab插图放大模糊,PPT中怎样简单处理放大后失真的图片
  18. Windows下搭建论坛服务器
  19. 使用IMU与轮速计进行单线激光雷达的运动畸变校正
  20. 太厉害了!28岁任北大博导的她,再获科学大奖!

热门文章

  1. 2015 多校联赛 ——HDU5344(水)
  2. 分布式文件系统MooseFs部署(二)
  3. LinkedHashMap/HashMap 介绍
  4. 论MySQL的监控和调优
  5. eclipse+mysql+tomcat配置JNDI
  6. 创建一个新的extender
  7. Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
  8. 手写token解析器、语法解析器、LLVM IR生成器(GO语言)
  9. C++ 模板的全特化与偏特化
  10. LeetCode -- Perfect Squares