没想到吧,一行注释也能影响运行结果!
创新互联建站从2013年成立,是专业互联网技术服务公司,拥有项目成都网站建设、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元莒南做网站,已为上家服务,为莒南各地企业和个人服务,联系电话:18982081108
也许你在某个段子里听说过,某行注释删掉后,程序竟然不能预期执行?真的会这样么?你还别不信。
见证“奇迹”
- #include
- #include
- int main(void)
- {
- int a = (int)sqrt(30);
- //is sqrt(30) + 1 > 5 ??/
- //故意让a++,你别管为什么
- a++;
- if(a > 5)
- printf("sqrt(30) +1 > 5 \n");
- else
- {
- printf("sqrt(30) +1 <= 5 \n");
- }
- return 0;
编译运行:
- $ gcc -o main main.c -trigraphs
- $ ./main
- sqrt(30) +1 > 5
作为受过九年义务教育的我们,一看就知道结果是对的,毕竟 5 * 5 < 30 < 6 * 6。
但是删掉第九行,再运行:
- $ ./main
- sqrt(30) +1 <= 5
结果竟然变了!!
看到这里,细心的读者可能已经发现了其中的端倪,我也就不卖关子了。接下来就说说我们本次要提到的主角-三字符组(trigraph sequences)。
三字符组
我们都知道C语言里面有很多转义符号,例如:
- \n 换行符(LF)
- \r 回车符(CR)
- \t 水平制表符(HT)
- \b 退格符(BS)
- \’ 单引号
- \” 双引号
- \\ 反斜杠
- ......
当然还有很多,我就不一一列举了。这些符号在代码中都有特别的作用,或者无法直接输入,因此用转移符+其他字符组合来代替。
同样的,早期的一些键盘可能没法输入一些特殊的符号,如:
- # $ @ [ \ ] ^ ` { | } ~
于是,为了解决这个问题C语言标准规定预处理器(C preprocessor)在扫描处理C语言源文件时,替换下述的3字符出现为1个字符:
也就是说,??/会被替换为\,如果删掉原先的第九行,就变成了:
- //is sqrt(30) + 1 > 5 \
- a++;
我们都知道,\的存在(通常一行代码太长,可以通过该符号来换行),使得上面看似两行,实则是一行。即变成了:
- //is sqrt(30) + 1 > 5 a++;
也就是说,a++根本不会执行了,当然会导致最终结果不符合预期。
当然了,很多现代编译器可能并不会做这样的替换,所以这样的问题也基本无需担心,老实用原本的符号即可。
实际上,细心的读者可能观察到了,我在前面例子代码中加了编译选项-trigraphs,否则的话,编译是有警告的:
- $ gcc -o main main.c
- main.c: In function ‘main’:
- main.c:6:27: warning: trigraph ??/ ignored, use -trigraphs to enable [-Wtrigraphs]
- //is sqrt(30) + 1 > 5 ??/
双字符组
除了三字符组,还有双字符组。
总结
今天的你不知道很难踩坑,知道了也没啥用的内容就介绍到这里了。
标题名称:一行注释也能影响运行结果?
浏览路径:http://www.gawzjz.com/qtweb/news47/202597.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联