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

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

见证“奇迹

 1#include 2#include  3int main(void) 4{ 5    int a = (int)sqrt(30); 6    //is sqrt(30) + 1 > 5 ??/ 7    //故意让a++,你别管为什么8    a++;9    if(a > 5)10        printf("sqrt(30) +1 > 5 ");11    else12    {13        printf("sqrt(30) +1 <= 5 ");14    }15    return 0;16}

编译运行:

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 换行符(LF)2 回车符(CR)3 水平制表符(HT)4b 退格符(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 ??/

双字符组

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

总结

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

关注我:带你遨游代码是世界

获取更多:点击文章下面的链接~

dev c++运行没有结果_「C/C++」一行注释也能影响运行结果?相关推荐

  1. 一行注释也能影响代码运行?别不信!

    ​来源:公众号[编程珠玑] 作者:守望先生 ID:shouwangxiansheng 没想到吧,一行注释也能影响运行结果 也许你在某个段子里听说过,某行注释删掉后,程序竟然不能预期执行?真的会这样么? ...

  2. docker 容器运行 golang程序_「Docker」 - 运行 amp; 管理容器

    容器是基于容器技术所建立和运行的轻量级应用运行环境,它是Docker封装和管理应用程序或微服务的「集装箱」,在Docker中,容器是最核心的部分. 一.容器的创建和启动 Docker容器的生命周期里分 ...

  3. amd cpu不能在cmd环境下运行java代码_「我们一起学Java02」JDK、JRE、JVM简介,Java开发平台的搭建...

    Hello,各位头条的读者大家好!接下来一段时间小编将和大家一起学习Java,"我们一起学Java"专题将会持续更新,欢迎大家关注.这里是"我们一起学Java" ...

  4. composer 安装dev包_「PHP编程」如何搭建私有Composer包仓库?

    在前一篇文章「PHP编程」如何制作自己的Composer包?中,我们已经介绍了如何制作自己的 composer 包,以及如何使用 composer 安装自己制作的 composer 包.不过,这其中有 ...

  5. 自定义变量 配置文件_「系统架构」Nginx调优之变量的使用(3)

    在上一篇文章「系统架构」Nginx调优之变量的使用(2)中我们介绍了自定义变量和内置变量,下面我们继续接着介绍Nginx中变量的可见性和动态内置变量. 变量的可见性 nginx中的变量虽然不全是全局变 ...

  6. 多维数组的索引与切片_「GCTT 出品」Go 系列教程——11. 数组和切片

    Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获! Go 系列教程是非常棒的一套初学者教程,入门就它了. 「GCTT 出品」Go 系列教程--1. 介绍与安装 「GCTT 出品」 ...

  7. jq发送动态变量_「系统架构」Nginx调优之变量的使用(3)

    在上一篇文章「系统架构」Nginx调优之变量的使用(2)中我们介绍了自定义变量和内置变量,下面我们继续接着介绍Nginx中变量的可见性和动态内置变量. 变量的可见性 nginx中的变量虽然不全是全局变 ...

  8. go 自定义error怎么判断是否相等_「GCTT 出品」Go 系列教程——30. 错误处理

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Go 系列教程是非常棒的一套初学者教程,入门就它了. 这是 Golang 系列教程中的第 30 篇.在本章教程中,我们 ...

  9. html js不触发_「万字整理 」这里有一份Node.js入门指南和实践,请注意查收 ??

    前言 什么是 Node.js 呢 ? JS 是脚本语言,脚本语言都需要一个解析器才能运行.对于写在 HTML 页面里的 JS,浏览器充当了解析器的角色.而对于需要独立运行的 JS,NodeJS 就是一 ...

最新文章

  1. CF535C Tavas and Karafs 二分 + 结论
  2. C/C++中break、return、continue和goto在循环语句中的使用
  3. 基于MFC和OpenCV的摄像机定标与立体匹配测试程序
  4. 优秀程序设计的原则(可以多读读)
  5. Pytorch Tensor与Numpy ndarray的交互/相互转化
  6. 学术会议演讲视频录制全方位指南
  7. Java 生成随机手机号,并写入数据库
  8. 业务部门战略规划与支撑部门战略规划
  9. 基于android终端的物联网医药物流管理系统设计公司,基于Android终端的物联网物流管理系统的设计与实现.pdf...
  10. java毕业设计民航售票管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  11. 修改war包中数据库配置信息
  12. buuctf————[Zer0pts2020]easy strcmp
  13. python爬取千图网_python爬取lol官网英雄图片代码
  14. 如何在Java中实现画图(图文并茂)(内附美丽的分型图片哦)
  15. DataGrip连接MySQL报错: Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezon
  16. 解决sql注入问题(丛林战争项目)
  17. php 运营商授权,PHP判断手机号运营商(详细介绍附代码)
  18. EfficientDeRain
  19. 程序员职场中的中年危机:30~40岁的年纪
  20. 掉光的头发竟然又长出来了!这瓶泰国变态生姜水,连秃头都能救一下!

热门文章

  1. boost::random模块实现允许直观地检查分布函数的结果的测试程序
  2. boost::mpl模块实现index_of相关的测试程序
  3. boost::mp11::mp_max相关用法的测试程序
  4. boost::metaparse::debug_parsing_error相关用法的测试程序
  5. boost::math::inverse_gamma_distribution用法的测试程序
  6. boost::math模块使用barycentric有理插值的测试程序
  7. GDCM:DICOM文件的覆盖测试程序
  8. boost::core模块实现分配器指针
  9. DCMTK:将DICOM文件的内容转换为JSON格式
  10. VTK:小部件之BoxWidget