一行注释也能影响运行结果?

开发 后端
没想到吧,一行注释也能影响运行结果!也许你在某个段子里听说过,某行注释删掉后,程序竟然不能预期执行?真的会这样么?你还别不信。

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

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

[[320558]]

见证“奇迹”

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

编译运行:

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

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

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

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

双字符组

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

总结

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

责任编辑:赵宁宁 来源: 编程珠玑
相关推荐

2020-02-28 15:27:31

代码开发工具

2022-03-21 17:54:52

Linux操作系统浏览器

2024-07-04 00:30:17

2024-08-01 09:57:17

DELETE死锁工具

2016-12-02 08:53:18

Python一行代码

2020-08-05 11:53:41

数据代码自动化

2021-09-13 10:14:28

代码开发命令

2022-04-11 11:38:44

Python代码游戏

2011-08-25 09:17:31

Java调用存储过程返回一行或多行结果集

2020-08-24 08:25:48

Python开发工具

2014-02-12 13:43:50

代码并行任务

2022-04-09 09:11:33

Python

2017-04-05 11:10:23

Javascript代码前端

2012-02-23 13:43:54

小米手机Windows XP

2022-02-08 22:18:10

Chrome插件服务器

2021-08-31 09:49:37

CPU执行语言

2021-10-19 17:52:16

Git命令算数

2017-04-13 19:20:18

Python代码并行任务

2020-09-09 16:00:22

Linux进程

2021-11-02 16:25:41

Python代码技巧
点赞
收藏

51CTO技术栈公众号