持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
前言
本文主要分享一波笔者对于C语言中注释、接续符以及单双引号的学习经验与心得。
笔者水平有限,难免存在纰漏,欢迎指正交流。
注释符、接续符与单双引号
注释符号
注释本质
//是C++下的注释风格,是行注释,而/* */是C下的注释风格,是代码块注释。
注释被替换,本质是替换成空格。
\是接续符,用来接续下一行代码
我们来看看下面的代码:
int main()
{
int /* */ i;
char *s = "abcdefgh //hijklmn";
//Is it a\
valid comment?
in/**/t j;
return 0;
}
在Linux环境下方便查看预编译后的代码:
从上图我们可以看出,无论注释多少内容,在预编译时都会被替换成空格,同时注释符号在字符串中不起作用,会被认为是字符串的一部分,而且接续符对注释有用。
不同风格对比
C风格注释无法嵌套
#include <stdio.h>
int main()
{
/*
/*printf("hello world");
printf("hello world");*/
*/
return 0;
}
最后会多出一个*/,因为/*总是与离它最近的*/匹配,上面代码中的两个/*都和第一个*/匹配了,第二个*/就多出来了。而C++风格注释可以嵌套。
注意这段代码
int main()
{
int x = 10;
int y = 0;
int z = 5;
int *p = &z;
y = x/*p;//会被编译器认为是注释
return 0;
}
为防止误会,应该加上圆括号,即y = x / (*p);。
注释的基本要求
1.注释应当准确易懂,防止有二义性。
2.编写代码边注释,修改代码的同时修改相应的注释,以保证注释与代码的一致性,不再有用的注释要及时删除。
3.注释应当简洁明了。
4.一目了然的语句不加注释。
5.对于全局数据必须要加注释。
6.注释的位置应与被描述的代码相邻,可以与语句在同一行,也可以在上行,但不可以在下行。同一结构中的不同域的注释要对齐。
7.当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。
8.注释的缩进要与代码的缩进一致。
9.注释代码时应注意“为何做”而不是“怎么做”。
10.数值的单位一定要注释。
11.对变量的范围给出注释,尤其是参数。
12.复杂的函数中,在分支语句、循环语句结束之后需要在花括号后面加上注释,方便区分各分支或循环体。
比如
while ()
{
if ()
{
for ()
{
if ()
{
}
else if ()
{
}
else
{
}
}//end of for
}//end of if
else if ()
{
while ()
{
if ()
{
for ()
{
}
}
}
}
else
{
}
for ()
{
if ()
{
}
}//end of for
}//end of while
提一嘴
基于条件编译,代码编译期间裁剪掉不用的代码
int main()
{
#if 0//条件为假,裁剪掉后面这些代码
printf("for test1\n"); //test1
printf("for test2\n"); //test2
#endif
return 0;
}
或者这样
int main()
{
#ifdef MONEY//定义了MONEY宏才会保留下面的代码,不然裁剪掉
printf("for test1\n"); //test1
printf("for test2\n"); //test2
#endif
return 0;
}
其实一些软件所谓的免费版和收费版用的是一套代码,只是免费版的用条件编译裁剪掉了一部分功能,不然同时维护两套代码成本未免有些高,只用一套代码的话维护方便还省事。
接续符
一行放不下的可以加个续行符转到下一行继续放。
int main()
{
int a = 1;
int b = 2;
int c = 3;
if (a == 1 &&\
b == 2 &&\
c == 3)
{
printf("hello world!\n");
}
return 0;
}
试试在\之后带上空格,行不行?
不行。在续行符之后不要加上其他任何符号,直接回车到下一行即可。
有人可能会说了,这段代码我在VS下不加接续符直接回车换行也没问题啊,那还用\来干嘛?在一些编译器中确实可以直接换行,但是使用\能明显增强可读性,让阅读代码的人清楚你确实是想要在这个地方换行。
还有就是,如果是对于字符串的换行的话就必须要用\来续行。
"hello \
world";
单引号和双引号
单引号是字符,双引号是字符串
先看看这个,不知道大家有没有了解过
char c = 'abcd'; //不超过四个字符在VS中可以这样做
你可能会说,字符型变量不是应该接收单个字符吗?为什么这样做不报错呢?
别急,看完这个例子或许你就能理解了。
例子:
int main()
{
printf("%d\n", sizeof(1));
printf("%d\n", sizeof("1"));
printf("%d\n", sizeof('1'));
char c = '1';
printf("%d\n", sizeof(c));
return 0;
}
输出结果会是你想的那样吗?
是不是有点奇怪,为什么sizeof('1')不是1居然是4!
C99标准的规定,'a'叫做整型字符常量(integer character constant),被看成是int型。
" "双引号里面的字符却又是一个字符占一字节。
而在C++中认为' '单引号字符常量大小是一个字节。
好,让我们回到前面那个问题上来,打印看看
char c = 'abcd';
printf("%c\n", c);
是不是更奇怪了,到底是为什么呢?
不是说' '单引号字符常量被看成是int型嘛,那我们指定int类型打印出来看看值是多少。
int main()
{
int ch = 'abcd';
printf("%d\n", ch);
return 0;
}
对应二进制数是110 0001 0110 0010 0110 0011 0110 0100
那'abcd'是怎么放进去的呢?我们知道肯定要先转换成对应的ASCII码,但是又如何存入内存的呢?
所以最多放入四个字符,每个字符对应放入一个字节。
当用char类型变量来接收'abcd'时,很明显一个字节的空间装不下四个字节的内容,就会发生截断,从低位向高位的方向截断,所以char c = 'abcd'; 赋值时把低地址的字节内容保留,其他截断舍弃,而d正好放在是最低地址处字节内,所以实际赋入的就是字符d。
以上就是本文全部内容,感谢观看,你的支持就是对我最大的鼓励~