扩展分析C语言单双引号、反斜杠与注释

打印 上一主题 下一主题

主题 672|帖子 672|积分 2016

目录

注释

C语言风格的注释: /* 这是注释 */
C++风格的注释: //这是注释

奇怪的注释
  1. int main()
  2. {
  3. int /* */ i;                    //1.正确
  4. char *s = "abcdefgh //hijklmn"; //2.正确://是字符串的一部分
  5. //Is it a\
  6. valid comment?                  //3.正确  注释可以通过续行符续行
  7. in/* */t j;                     //4.报错
  8. system("pause");
  9. return 0;
  10. }
复制代码
gcc4.8.5的语法查抄:

为什么4是错的?  看预编译后的结果:
实行预编译下令:gcc -E test.c -o test.i

(发现预处理阶段gcc并没有报错,说明问题是出在编译后的)

可以发现 第9行 int中间多了空格,说明注释在预编译可能会被转化成空格.
而第5行的int i中间只有一个空格,说明注释是直接被删除或合并成一个空格.
结论:注释在预编译后会替换成空格,具体替换方式由编译器决定

C风格的注释无法嵌套

预编译:

可以发现预编译后上面两个\*没有了,下面还有一个*\.
原因: C语言把遇到的第一个/*之后的数据都当作注释,直到遇到第一个/*,因此嵌套在中间的/*不会再被查抄出来.且在预处理阶段会删除掉这些注释.所以嵌套的注释会留下一个*.
C风格注释接纳的是就近原则.如果要能嵌套,就得使用就远原则才足以容纳多个嵌套
至于为什么不选择像代码块这样的匹配规则,可能就是历史遗留问题了,有知道的朋友可以分享在批评区.

一些特殊的注释


  • 宏中间的注释


  • 除号和*号同时使用

办理方法:
1.在/和*后加上一个空格  int b = 20/ *p
2.用圆括号把(*)括起来int b = 20/(*p) ,推荐这种方式,更为直观


注释的规则建议


  • 注释应当准确、易懂,防止有二义性。错误的注释不但无益反而有害。
  • 边写代码边注释,修改代码的同时修改相应的注释,以包管注释与代码的一致性。不再有用的注释要即使删除。
  • 注释是对代码的的“提示”,而不是文档。程序中的注释应当简单明了,注释太多了会让人眼花缭乱。
  • 对于全局数据(全局变量、常量定义等)必须要加注释。
  • 注释的位置应与被描述的代码相邻,可以与语句在同一行,也可以在上行,但不可以放在下方。同一结构中不同域的注释要对齐。
  • 今世码比较长,特殊是有多重嵌套时,应当在一些段落的竣事处加注释,便于阅读。
  • 注释代码段时应注重“为何做(why) ",而不是怎么做”(how)“
    说明怎么做的注释一般停留在编程语言的条理,而不是为了说明问题。努力论述“怎么做”的注释一般没有告诉我们操纵的意图,而指明“怎么做”的注释通常是冗余的。
  • 数值的单位一定要注释。如时、分、秒等单位。
  • 对变量的范围给出注释,尤其是参数。
  • 对一系列的数字编号给出注释,尤其在编写底层驱动程序的时间(好比引脚编号)。
  • 在复杂的函数中,在分支语句、循环语句竣事之后需要适当的注释,方便区分各分支或循环体。(很多时间代码写长后,一个屏幕内看不到下面的代码,不知道哪个才是相应代码块匹配的花括号)

反斜杠'\'


反斜杠有续行的作用,但要注意续行后不能添加空格

如图,在续行符前加多个空格没有影响:

但续行符后不能加空格


回车也能起到换行的作用,那续行符的意义在哪?

续航符本身就有自描述性.这是续行符最大的意义,就是要明确告诉别人这里是换行的,没有二义性.如果使用回车,别人在阅读的时间有可能需要思考是不是故意换行的或者是不是不小心误敲了.

反斜杠的转义功能

转义,即对某些字符进行反斜杠,可以使之拥有凌驾本身的功能,
转义有两种,一种是诸如\n,\t这样的转义字符,转义后具有本身字面值之外的特殊功能;另一种诸如\",\\这种,本身字面值没有意义,而是其他功能,转义后具有字面值的意义.
转义的功能简单描述就是 (a. 字面转特殊  b. 特殊转字面)

单引号和双引号

基本概念:单引号内的是字符,双引号的是字符串

字面值,字符串,字符,字符变量的巨细

sizeof分别盘算巨细:


为什么sizeof('1')的巨细是4 ?

C99标准的规定,'a'这种单引号引起来的字符叫做整型字符常量(integer character constant),会被编译器当作整型.因此巨细是4个字节
(注意:在C++中字符常量巨细为1,不同平台/语言解释是不一样的.)


char范例一直在发生截断.

char范例基本上都是吸收整型字符常量,而char范例只占一个字节巨细,因此只能保留整型的一个字节(首字节),即截断.

不允许定义空字符常量

单引号内至少要有一个字面值


单引号内一般是一个字符,还可以有多个字符

如下图,可以发现是没有警告的.

打印结果:

但是最多4个字符,多了会告警

为什么能这样用呢? 也是上文所说的,字符常量被C语言当作整型来对待,分配了4个字节.
一个字符字面值就占一个字节,4个字符就刚好占了4个字节,整型分配的空间能够满足.
而char范例又是截断了整型的低地点字节位,因此只会输出最后一个字符字面值(小端).


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表