C语言中的“三字母词”坑了工程师!什么是“三字母词”?
某软件工程师接盘了前同事的项目,进度一拖再拖,最后发现问题出现在如下代码:
// 注释语句 ??/ 2a = b+c;
请注意代码中的“??/”,就是这注释隐藏的很深,让项目一拖再拖。
"??/"会被编译器当作 /,变成C语言的换行符(多行代码连接符)。于是这段代码等同于// 注释语句 a = b+c ;就会被注释掉。
下面我们就是说说“??/”这种“三字母词”的内容。
什么是“三字母词”
在ANSI标准中,定义了“三字母词”,或者成为“三联符序列”,英文为"trigraph sequences"。
目的主要是为了在一些特定的字符集中,比如一些七位代码集中,解决一些特定字符的输入问题。
也许是由于这些字符集我们基本上用不到,所以在大多数C语言的书籍中,我们都看不到对“三字母词”的讲解。
这里资料来源于参考ANSI C99标准(即传说中的《American National Standards Institute for Programming Languages-C》 1999年,我们习惯简称为“C99”)。
“三字母词”主要有9个,分别为:
源代码中的“三字母词”,在编译阶段会被替换为“对应的字符”。对于以“?”开头的字符序列,如果不能与上面9个匹配,编译器将保持原状;一旦匹配,编译器就会做替换。
“三字母词”例子
例子1:C99标准中给出的例子
printf("Eh???/n");
相当于:
printf("Eh/n");
例子2:一个我们容易犯的错误(摘自《Pointers On C》)
printf("Delete file (are you really sure??):");
运行结果为(三字母词“??)”编译时替换为“]”):
Delete file(are you really sure]:
而不是我们想象中的:
Delete file(are you really sure??):
最后
由于编译器的种类各样,对ANSI C的支持也不一样,所以可能会有些C编译器不处理“三字母词”,会将它们当做普通的字符串来处理。
————————————————
- End -
不管你是转行也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~+
【值得关注】我的 编程学习交流俱乐部 !【点击进入】
C语言入门资料(网盘链接免费分享):
C语言推荐书籍(PDF免费分享):
原文地址:https://www.cnblogs.com/huya-edu/p/15364147.html
- 临时表相关 (r4笔记第52天)
- Java基础-08(02)总结帮助文档,代码块,继承
- java中堆和栈的区别
- 通过shell来比较oracle和java中的字符串使用(r4笔记第49天)
- Java 单例以及单例所引发的思考
- AJAX跨域完全讲解
- 最简单的web服务器实现(一)(r4笔记第68天)
- 算法09 五大查找之:哈希查找
- JSP面试题都在这里
- Java基础-07(01).总结private,this,封装,static,成员方法变量,局部变量匿名对象
- HTTP就是这么简单
- 重温二分查找算法(r4笔记第66天)
- 【不用框架】文件上传和下载
- JSP第七篇【简单标签、应用、DynamicAttribute接口】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP pthreads v3使用中的一些坑和注意点分析
- php ActiveMQ的安装与使用方法图文教程
- ThinkPHP5与单元测试PHPUnit使用详解
- php实现通过stomp协议连接ActiveMQ操作示例
- PHP pthreads v3下的Volatile简介与使用方法示例
- php实现根据身份证获取精准年龄
- php 使用ActiveMQ发送消息,与处理消息操作示例
- php使用gearman进行任务分发操作实例详解
- laravel框架select2多选插件初始化默认选中项操作示例
- PHP pthreads v3在centos7平台下的安装与配置操作方法
- laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
- PHP Beanstalkd消息队列的安装与使用方法实例详解
- 解决windows上php xdebug 无法调试的问题
- php7 图形用户界面GUI 开发示例
- Django开发的简易留言板案例详解