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之前的地址空间)不能再程序中随意访问
    C语言进阶学习4 注释符号,接续符,转义符,单引号,双引号

C语言进阶学习4 注释符号,接续符,转义符,单引号,双引号

由此可知道段错误的原因。

在来一段概念混淆的代码

#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编译器允许字符串对字符变量赋值,但只能得到错误