热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

verilog换行太长代码_一行注释也能影响代码运行结果?

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

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

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

见证“奇迹”

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

编译运行&#xff1a;

1$ gcc -o main main.c -trigraphs2$ ./main3sqrt(30) &#43;1 > 5 

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

但是删掉第九行&#xff0c;再运行&#xff1a;

1$ ./main2sqrt(30) &#43;1 <&#61; 5 

结果竟然变了&#xff01;&#xff01;

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

三字符组

我们都知道C语言里面有很多转义符号&#xff0c;例如&#xff1a;

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

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

同样的&#xff0c;早期的一些键盘可能没法输入一些特殊的符号&#xff0c;如&#xff1a;

1# $ &#64; [  ] ^ &#96; { | } ~ 

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

三字符组替换为

abd49acc12bb9d57d53044f60d996196.png

也就是说&#xff0c;??/会被替换为&#xff0c;如果删掉原先的第九行&#xff0c;就变成了&#xff1a;

1    //is sqrt(30) &#43; 1 > 5 2    a&#43;&#43;;

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

1    //is sqrt(30) &#43; 1 > 5 a&#43;&#43;;

也就是说&#xff0c;a&#43;&#43;根本不会执行了&#xff0c;当然会导致最终结果不符合预期。

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

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) &#43; 1 > 5 ??/

双字符组

除了三字符组&#xff0c;还有双字符组。

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

总结

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

但是留个问题&#xff1a;

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

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



推荐阅读
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • linux 字符串数组初始化,C++字符数组初始化方法的分析
    发现了一个字符数组初始化的误区,而这个往往能导致比较严重的性能问题,分析介绍如下:往往我们在初始化一个字符数组,大概有如下几 ... [详细]
  • golang源码分析调度概述
    golang源码分析-调度过程概述本文主要概述一下golang的调度器的大概工作的流程,众所周知golang是基于用户态的协程的调度来完成多任务的执行。在Linux ... [详细]
author-avatar
该改改小心眼_222
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有