ToB企服应用市场:ToB评测及商务社交产业平台

标题: 扩展分析C语言单双引号、反斜杠与注释 [打印本页]

作者: 三尺非寒    时间: 2024-9-18 19:55
标题: 扩展分析C语言单双引号、反斜杠与注释
目录

注释

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) ,推荐这种方式,更为直观


注释的规则建议


反斜杠'\'


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

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

但续行符后不能加空格


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

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

反斜杠的转义功能

转义,即对某些字符进行反斜杠,可以使之拥有凌驾本身的功能,
转义有两种,一种是诸如\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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4