C语言进阶学习4 注释符号,接续符,转义符,单引号,双引号
本博客记录狄泰学院课程的学习
学习交流群:320628659
个人QQ:1367087622
欢迎大家交流学习
本章的学习目标:
注释符号,接续符,转义符,单引号,双引号 的学习分析
学习这些知识点使用需要注意的事项
注释符号,接续符,转义符,单引号,双引号
注释符号(//,/* */)
- 注释的第一印象,认为是很简单的,对程序的功能也没有影响,没有必要深究。
- 但是注释也是C语言中最重要的工具,一个项目是否能够容易维护,良好的注释就能减少很多上手的时间。
- 注释符号有两种
- //
- /* */
注释规则
- 编译器在编译过程中使用空格替换整个注释
- 字符串字面量中的==//和/**/==不代表注释符号
- /* */型注释不能被嵌套
注释用于阐述原因和意图而不是描述程序的运行过程
注释应该准确易懂,防止二义性,错误的注释有害无益
注释是对代码的提示,避免臃肿和喧宾夺主
一目了然的代码避免加注释
接续符和转义符
接续符的使用
- 编译器会将反斜杠剔除,跟在反斜杠后面的字符自动接续到前一行
- 在接续单词时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格
- 接续符适合在宏定义代码块时使用
#include <stdio.h>
#define SWAP(a,b) \
{ \
int temp = a; \
a = b; \
b = temp; \
}
int main()
{
int a = 1;
int b = 2;
int c = 3;
SWAP(a,b);
printf("a = %d, b = %d\n", a, b);
SWAP(b,c);
printf("b = %d, c = %d\n", b, c);
return 0;
}
转义符的意义
- C语言中的转义符(\)主要用于表示无回显字符,也可以用于表示常规字符
\n | 回车换行 |
---|---|
\t | 横向跳到下一制表位置 |
\v | 竖向跳格 |
\b | 退格 |
\r | 回车 |
\f | 走纸换页 |
\\ | 反斜杠符“\” |
\’ | 单引号符 |
\a | 鸣铃 |
\ddd | 1~3位八进制数所代表的字符 |
\xhh | 1~2位十六进制数所代表的字符 |
转义符的使用
- 当反斜杠(\)作为转义符使用时必须出现在单引号或者双引号之间
#include <stdio.h>
int main()
{
char enter = '\n';
char* p = "\141\t\x62";
printf("%s", p);
printf("%c", enter);
return 0;
}
单引号(‘ ’)和双引号(“ ”)
-
C语言中的单引号用来表示字符字面量
-
C语言中的双引号用来表示字符串字面量
'a’表示字符字面量,在内存中占1个字节
‘a’ + 1表示‘a’的ASCII码加1,结果为‘b’
“a”表示字符串字面量,在内存中占2个字节
“a”+1表示指针运算,结果指向“a”字符串结束符‘\0’
下面的程序合法吗?
#include <stdio.h>
int main()
{
char* p1 = 1 ;
char* p2 = '1';
char* p3 = "1";
//在这之前的操作,虽然编译通过,但是会有警告,至于警告的原因下面给出解答
printf("%s, %s, %s", p1, p2, p3);//这里会产生段错误
printf('\n');
printf("\n");
return 0;
}
在分析这段代码段错误的原因之前有一个小贴士
小贴士
- 字符字面量被编译为对应的ASCII码
-
字符串字面量被编译为对应的的内存地址
- 字符串在编译后就会放在0x08048000之后的内存地址空间,而我们在程序中得到的是存放这一段字符串的内存空间的地址,占用4个字节
- printf的第一个参数被当做字符串内存地址
- 内存的低地址空间(0x08048000之前的地址空间)不能再程序中随意访问
由此可知道段错误的原因。
在来一段概念混淆的代码
#include <stdio.h>
int main()
{
//意图为比较输入的字符除去tab,空格,回车
char c = " ";
while( (c == "\t") || (c == " ") || (c == "\n") )
{
scanf("%c", &c);
}
return 0;
}
这段代码混淆了单引号和双引号的概念
程序分析
char c = “string”;发生了什么?
分析:
1)编译后的字符串“string”的内存地址被赋值给变量c
2)内存地址占用4个字节,而变量c只占用了1个字节
3)由于类型不同,赋值后根据类型转换规则发生了截断
应该将代码改为
#include <stdio.h>
int main()
{
char c = ' ';
while( (c =='\t') || (c == ' ') || (c == '\n') )
{
scanf("%c", &c);
}
return 0;
}
单引号括括起来的单个字符代表ASCII整数
双引号括起来的字符代表字符指针
C编译器接受字符和字符串的比较,但无任何意义
C编译器允许字符串对字符变量赋值,但只能得到错误