没想到吧,一行注释也能影响运行结果

也许你在某个段子里听说过,某行注释删掉后,程序竟然不能预期执行?真的会这样么?你还别不信。

见证“奇迹”

 1//来源:公众号【编程珠玑】 2//作者:守望先生 3#include  4#include  5int main(void) 6{ 7    int a = (int)sqrt(30); 8    //is sqrt(30) + 1 > 5 ??/ 9    //故意让a++,你别管为什么10    a++;11    if(a > 5)12        printf("sqrt(30) +1 > 5 \n");13    else14    {15        printf("sqrt(30) +1 <= 5 \n");16    }17    return 0;18}

编译运行:

1$ gcc -o main main.c -trigraphs2$ ./main3sqrt(30) +1 > 5 

作为受过九年义务教育的我们,一看就知道结果是对的,毕竟 5 * 5 < 30 < 6 * 6。

但是删掉第九行,再运行:

1$ ./main2sqrt(30) +1 <= 5 

结果竟然变了!!

看到这里,细心的读者可能已经发现了其中的端倪,我也就不卖关子了。接下来就说说我们本次要提到的主角-三字符组(trigraph sequences)。

三字符组

我们都知道C语言里面有很多转义符号,例如:

1\n 换行符(LF)2\r 回车符(CR)3\t 水平制表符(HT)4\b 退格符(BS)5\’ 单引号6\” 双引号7\\ 反斜杠8......

当然还有很多,我就不一一列举了。这些符号在代码中都有特别的作用,或者无法直接输入,因此用转移符+其他字符组合来代替。

同样的,早期的一些键盘可能没法输入一些特殊的符号,如:

1# $ @ [ \ ] ^ ` { | } ~ 

于是,为了解决这个问题C语言标准规定预处理器(C preprocessor)在扫描处理C语言源文件时,替换下述的3字符出现为1个字符:

三字符组 替换为
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~

也就是说,??/会被替换为\,如果删掉原先的第九行,就变成了:

1    //is sqrt(30) + 1 > 5 \2    a++;

我们都知道,\的存在(通常一行代码太长,可以通过该符号来换行),使得上面看似两行,实则是一行。即变成了:

1    //is sqrt(30) + 1 > 5 a++;

也就是说,a++根本不会执行了,当然会导致最终结果不符合预期。

当然了,很多现代编译器可能并不会做这样的替换,所以这样的问题也基本无需担心,老实用原本的符号即可。
实际上,细心的读者可能观察到了,我在前面例子代码中加了编译选项-trigraphs,否则的话,编译是有警告的:

1$ gcc -o main main.c2main.c: In function ‘main’:3main.c:6:27: warning: trigraph ??/ ignored, use -trigraphs to enable [-Wtrigraphs]4     //is sqrt(30) + 1 > 5 ??/

双字符组

除了三字符组,还有双字符组。

双字符组 替换为
<:> [
:> ]
{
%> }
%: #

总结

今天的你不知道很难踩坑,知道了也没啥用的内容就介绍到这里了。

END

若觉得文章对你有帮助,随手转发分享,也是我们继续更新的动力。送100G资源,涵盖C/C++、Python、Linux、JAVA、数据结构、算法等入门基础资料。

js 双引号一行两行_一行注释也能影响运行结果?相关推荐

  1. dev c++运行没有结果_「C/C++」一行注释也能影响运行结果?

    没想到吧,一行注释也能影响运行结果 也许你在某个段子里听说过,某行注释删掉后,程序竟然不能预期执行?真的会这样么?你还别不信. 见证"奇迹" 1#include 2#include ...

  2. 如何读入一个多行的txt文件,给每行的数据加双引号并保存为一行输出

    问题描述: 例如:有这样一个txt文件,里面每一行都是博客链接,但是想要在每一行都用双引号引起来 怎么解决呢,利用python 短短的几行代码即可解决 bb.txt为原有文件 现在将其每一行的链接都用 ...

  3. sublime软件中如何给很多行数据加逗号及双引号并转换成一行?

    类似于下面这样很多的数据,如何快速的为其加上逗号.双引号? 方法如下:全选(ctrl+a)–ctrl+h键,得到如下效果: 接着给尾部添加引号和逗号:ctrl+h键,得到如下效果: 最后将多行数据转换 ...

  4. java双引号的转义字符_好程序员Java教程分享常见的转义字符

    原标题:好程序员Java教程分享常见的转义字符 好程序员Java教程分享常见的转义字符,在Java字符常量中,反斜杠(\)是一个特殊的字符,被称为转义字符,它的作用是用来转义后面一个字符.转义后的字符 ...

  5. Js双引号和单引号使用注意事项

    单引号和双引号 ①引号(同类型的引号,单引号和双引号是不同类型)是成双对的,在读第一个引号时开始,读到第二个结束,遇到第三个又开始,第四个又结束-- 例: var a = "小菜鸡'+'是谁 ...

  6. word双引号间距大_解决Word 2013的双引号尴尬

    很多朋友已经开始使用Office2013,不过当你在Word2013组件输人双引号的时候,如果是使用智能五笔等第三方输人法,那么经常会出现半角双引号的情况,而系统自带的微软拼音输人法却是一切正常.经过 ...

  7. datatables 一行数据生成两行_一行代码搞定分组回归

    写 在前面 在目前为止所有小伙伴们向大猫请教过的R问题中,大猫总结了最常遇见同时也是比较难的三个问题,分别是(1)事件研究法:(2)分组回归:(3)滚动回归.事件研究法在第一期中已经讲述,本期我们就来 ...

  8. python怎么返回上一行代码_一行Python代码能做出哪些神器的事情

    原标题:一行Python代码能做出哪些神器的事情 (1)一行代码启动一个Web服务 python -m SimpleHTTPServer 8080 # python2 python3 -m http. ...

  9. define 双引号 其他宏_当年宏语言不受欢迎?背后的原因你知道吗?

    人类用计算机处理文本主要是依赖宏语言以及一些专用的文本编辑器.事实上,早期的文本编辑器只提供基本的文本编辑功能,然后借助宏语言进行功能扩展.结果人类很快就发现,基于宏扩展的编辑器,功能越复杂,它的行为 ...

  10. JS双引号转义,号切割

    2019独角兽企业重金招聘Python工程师标准>>> <html> <head> <script type="text/javascript ...

最新文章

  1. 软件相关模块与ansible剧本
  2. springmvc五:使用pojo作为参数
  3. ionic3 cordova ionic-native插件
  4. Redis未授权访问漏洞记录(端口:6379)
  5. 容器编排技术 -- Kubernetes Pod 优先级和抢占
  6. python为什么没有数据类型_python3 数据类型
  7. Python语法基础:面向对象2
  8. Javascript (history,location)对象
  9. Flyweight模式
  10. Matlab简单教程:函数
  11. C#.NET com组件的编写
  12. Java interviewee-基础知识《一》
  13. 图神经网络-图游走类模型-作业
  14. VB操作EXCEL表的常用方法
  15. uIP TCP Server 运行机制分析
  16. Python打开记事本
  17. 7-148 试试多线程 (10 分)
  18. Soot 静态分析框架(二)Soot的核心
  19. 经济金融经典书籍推荐(中文版)——转自豆瓣
  20. 下载 | 5 本程序员成长必读书籍

热门文章

  1. 运动状态估计之卡尔曼滤波详解
  2. 3D视觉创新方案分享:仓储VSLAM/商品三维重建/静态场景重建/表情识别等多个方向...
  3. 三维重建的定位定姿算法
  4. 关于国庆假期延长的通知
  5. 非常详细的机器学习知识点汇总(二)之SVM23问
  6. 半个月使用rust语言的体验
  7. 第1章—Spring之旅—简化Spring的java开发
  8. python运算优先级
  9. 1到20的阶乘倒数之和
  10. sublime text 2 常用快捷键