1 编译时对注释处理的规则:
1.1 编译器会在编译过程中删除注释,但不是简单的删除,而是用空格代替。
1.2 编译器认为用双引号括起来的内容都是字符串,双斜杠也不例外。
1.3 /*...*/型注释是不能被嵌套的。
2 接续符'\':指示编译器行为的利器。
2.1 编译器会将反斜杠剔除,跟在反斜杠后面的字符自动接到前一行。
2.2 在接续单词时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。
2.3 接续符适合在定义宏代码块的时候使用。
eg:
#include <stdio.h>
#define SWAP(a,b) \
{ \
int m; \
m = a; \
a = b; \
b = m; \
} \
void main()
{
int a = 9;
int b =18;
SWAP(a,b);
printf("%d %d\n", a ,b);
getchar();
}
以上代码中就使用了接续符定义了一个宏代码块。读者不妨思考一个问题:该宏代码块和以下代码有什么区别?
void swap(int a,int b)
{
int m;
m = a;
a = b;
b = m;
}
也就是用函数和用宏代码块有什么区别?用函数能实现我们想要的功能吗?
ANS:
以下为个人的理解:
抓住一点:#define是单纯的进行文本的替换,也就是说,编译器在编译的时候,会把我们main函数里面代码SWAP(a,b)纯与上述定义的宏进行纯文本替换。如下:
void main()
{
int a =9;
int b =18;
{
int m;
m = a;
a = b;
b = m;
}
printf("%d %d\n", a ,b);
getchar();
}
很显然上述代码能够实现我们想要的结果。那么用我们之前提到的那个函数能够实现我们想要的功能吗?答案是不能!
这里简单提一下,因为上述提到的函数的参数传递方式是值传递方式,并没有对变量进行改变。具体讲解请参看我之前写的文章“2015.8.5关于指针的个人理解”。
3 转义符 '\'
同样也是和持续符一样的反斜杠,但是转义符却有不同的含义。
转义符主要用于在字符串中表示“无回显字符”,也可以表示常规字符。
无回显字符:类似有换行\n,制表符\t,回车\r……的特殊字符。