[深入浅出C语言]注释符、接续符和单双引号

841 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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。


以上就是本文全部内容,感谢观看,你的支持就是对我最大的鼓励~

src=http___c-ssl.duitang.com_uploads_item_201708_07_20170807082850_kGsQF.thumb.400_0.gif&refer=http___c-ssl.duitang.gif