​来源:公众号【编程珠玑】

作者:守望先生

ID:shouwangxiansheng

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

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

见证“奇迹”

 1//来源:公众号【编程珠玑】2//作者:守望先生3#include <stdio.h>4#include <math.h>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    else
14    {
15        printf("sqrt(30) +1 <= 5 \n");
16    }
17    return 0;
18}

编译运行:

1$ gcc -o main main.c -trigraphs
2$ ./main
3sqrt(30) +1 > 5

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

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

1$ ./main
2sqrt(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.c
2main.c: In function ‘main’:
3main.c:6:27: warning: trigraph ??/ ignored, use -trigraphs to enable [-Wtrigraphs]
4     //is sqrt(30) + 1 > 5 ??/

双字符组

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

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

总结

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

但是留个问题:

为什么例子中我们使用了sqrt函数,但在编译时却不需要链接math库?答案在这里一个奇怪的链接问题

关注公众号【编程珠玑】,获取更多Linux/C/C++/数据结构与算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源

一行注释也能影响代码运行?别不信!相关推荐

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

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

  2. 控制台报 [WDS] Disconnected!不影响代码运行。

    1. 问题:Vue运行项目时,控制台报 [WDS] Disconnected!不影响代码运行. 2. 解决方法:将config文件夹下的index.js中的host: '0.0.0.0',改为host ...

  3. iar代码优化影响运行速度吗_Java 性能优化:教你提高代码运行的效率

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:五月的仓颉 cnblogs.com/xrq730/p/486 ...

  4. Python求解一元二次方程问题【简单易懂,注释超全,代码可以直接运行】

    Python求解一元二次方程问题[简单易懂,注释超全,代码可以直接运行] 业务需求: 解一元二次方程是初中数学中的基本知识,- -般来讲解法有公式法.因式分解法等.可以根据自己 的理解,写- -段求解 ...

  5. GMOEA代码运行2--运行环境的搭建和运行

    GMOEA代码的运行 引言 Generative Adversial Networks(GAN) GAN生成的动机 什么是GAN GAN能做什么 GAN的训练过程 一个生动的比喻 GMOEA-- GA ...

  6. Java 性能优化:教你提高代码运行的效率

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:五月的仓颉 cnblogs.com/xrq730/p/486 ...

  7. yolov3网络结构图_目标检测——YOLO V3简介及代码注释(附github代码——已跑通)...

    GitHub: liuyuemaicha/PyTorch-YOLOv3​github.com 注:该代码fork自eriklindernoren/PyTorch-YOLOv3,该代码相比master分 ...

  8. access 提供程序无法确定object 值_Python | 加一行注释,让你的程序提速10+倍!numba库十分钟上手指南...

    如果你在使用Python进行高性能计算,Numba提供的加速效果可以比肩原生的C/C++程序,只需要在函数上添加一行@jit的装饰.它支持CPU和GPU,是数据科学家必不可少的编程利器. 之前的文章 ...

  9. cmake release和debug代码运行效果不一样_这35个小细节,让你的Java 代码运行效率翻倍!...

    传智播客博学谷 加小谷vx:boxueguu 免费领IT各学科资料.课程 Get更多干货直播课 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码 ...

最新文章

  1. 巧解SEP杀毒软件卸载需要密码才能完全卸载问题
  2. multi-thread handling for batch request
  3. plsql创建表提示标识符过长_创建安全多签名钱包及高级设置
  4. JavaScript基本资料
  5. 2012-13学年上半学期路由与交换课程设计-作业-2
  6. R语言的特征选择(Feature Selection)包:Boruta和caret
  7. ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
  8. Vim 和 NeoVim 曝出高危漏洞
  9. 不可逆调速matlab,双闭环不可逆直流调速系统课程设计(matlab仿真设计)
  10. 这几个方法让你学会PDF尺寸大小怎么调整
  11. python爬取电影信息并插入至MySQL数据库
  12. Android PC同步软件 类似 apple 的 itunes
  13. 用Python做游戏有多有趣——这还拿不下你?
  14. C语言入门(1)——Hello World
  15. Java开发和测试开发面试杂记
  16. R语言ggplot2可视化、在一张图中画出两条曲线(two lines in same ggplot2 graph)、使用pdf函数将ggplot2可视化图像保存到指定目录的pdf格式文件中
  17. 共轭梯度法(Conjugate Gradients)(3)
  18. 圆是由原子构成的吗?
  19. Z-Wave 抓包工具使用说明
  20. 最新QS世界大学排名揭榜!清华超越耶鲁、哥大

热门文章

  1. 【论文阅读笔记】 基于无人机多光谱影像的水稻叶面积指数预测
  2. Eclipse连接天天模拟器进行调试
  3. 【有机】JACS:硫叶立德的新作用--Z/E选择性烯烃化醛和磺酰亚胺
  4. 数字孪生钢铁行业研究案例
  5. 计算机cpu的相关知识,电脑CPU的相关知识
  6. #js--js获取${pageContext.request.contextPath}得到项目的根路径
  7. php mysql sum()_PHP MYSQL中的SUM和循环(SUM and Looping in PHP MYSQL)
  8. php单元测试工具入门,PHPUnit 单元测试安装与使用入门教程
  9. Myriad2 简介
  10. 密码学前提知识了解(一)