一、注释
1.1 单行注释
- 位置:可放在代码后,称之为行尾注释; 也可放代码上一行,称作行上注释。
1 | |
1.2 多行注释
- 语法:/* 待注释的内容 */
- 注意:多⾏注释内,可以嵌套单⾏注释。 多⾏注释之间不能嵌套。
1 | |
1.3 注释的小扩展
- 注释的快捷键:Ctrl + K,Ctrl + C/U
- 注释擦除:注释的内容,不参与运行
- 注释的嵌套:不管是单行还是多行,最好都不要嵌套
二. 常量
2.1 什么是常量
程序运行的过程中,其值永远不会发生改变的数据
2.2 常量的分类

2.3 输出常量
利用printf集合占位符的方式可以输出常量
格式:
printf(参数1,参数2);
参数1:输出内容的最终样式,以字符串的形式体现 (必填)
参数2:填补的内容 (选填)
占位符:
| 占位符 | 说明 |
|---|---|
| 整形 | %d |
| 实型 | %f |
| 字符 | %c |
| 字符串 | %s |
2.4 输出多个常量
一个printf中可以同时输出多个数据,占位符和后面的数据要一一对应
2.5 输出并换行
| 操作系统 | 换行符 |
|---|---|
| windows | \r\n |
| mac | \r |
| Linux | \n |
平时写代码的时候,想要换行直接写\n即可,C语言会根据不同的操作系统解析成对应的换行符
三.变量
3.1 变量的三要素
- 变量名:用来在程序中使用。
- 变量类型:开辟内存空间大小。
- 变量值:存储的实际数据
3.2 变量定义:
类型名 变量名 = 变量值(一般都这么写)
举例:
int m = 57;
会开辟内存空间给变量。变量声明不会开辟内存空间。
3.3 变量的注意事项
- 只能存一个值
- 变量名不允许重复定义
- 一条语句可以定义多个变量
- 变量在使用之前一定要进行赋值
- 变量的作用域范围
四.数据类型
4.1sizeof 运算符
目标:会查看变量、类型占用内存大小
每种数据类型,都有自己固定的占用内存大小和取值范围。具体展开讲解前,我们先来看下,C 语言提供的查看变量或类型占用内存大小的运算符,sizeof。
语法 1:sizeof(变量名)
1
2
3int a = 10;
printf("%llu\n", sizeof(a));//sizeof(a) 获取 a 变量占用内存大小。可以用 printf 显示出来
// 查看 sizeof 返回的占用内存大小,需要使用 %llu 格式符语法 2:sizeof(类型名)
1
printf("%llu\n", sizeof(double)); // 也可以使用 sizeof 直接查看某种类型占用的内存大小
4.2数值型
4.2.1 整型
| 数据类型 | 字节数 | 格式符 | 数据范围 | 最小值宏 | 最大值宏 |
|---|---|---|---|---|---|
| short(短整型) | 2 | %hd | -215 ~ 215-1 (-32768 ~ 32767) | SHRT_MIN | SHRT_MAX |
| int(整型) | 4 | %d | -231 ~ 231-1 (-2147483648 ~ 2147483647) | INT_MIN | INT_MAX |
| long(长整型) | 4 | %ld | -231 ~ 231-1 (-2147483648 ~ 2147483647) | LONG_MIN | LONG_MAX |
| long long(长长整型) | 8 | %lld | -263 ~ 263-1 | LLONG_MIN | LLONG_MAX |
| unsigned short(无符号 短整型) | 同 short | %hu | 0 ~ 216-1 (0 ~ 65535) | 0 | USHRT_MAX |
| unsigned int(无符号 整型) | 同 int | %u | 0 ~ 232-1 (0 ~ 4294967295) | 0 | UINT_MAX |
| unsigned long(无符号 长整型) | 同 long | %lu | 0 ~ 232-1 (0 ~ 4294967295) | 0 | ULONG_MAX |
| unsigned long long(无符号 长长整型) | 同 long long | %llu | 0 ~ 264-1 | 0 | ULLONG_MAX |
上表中列出的占用字节数和取值范围,是大多数情况下各种类型的取值。
由于,C 标准没有具体规定以上各类数据所占用的字节数。因此,在不同系统、编译器下,数据类型占用的字节数会有所不同。
比如:int 类型,在 Turbo C 环境占 2 字节,取值范围与 short 相同。 而在 Visual C 环境下是 4 字节。
再如:long 类型,相同的 gcc 编译器下,在 Windows 系统中占 4 字节,而在 Linux 系统中占 8 字节。
可以使用 sizeof 查看 数据类型 占用内存的大小。
可以引入头文件 #include <limits.h> 借助宏来查看 数据类型 在当前平台上 对应的最小、最大值。
4.2.2 bool型
目标:知道 bool 类型两种取值
C语言在设计之初是没有布尔类型的,使用 1 和 0,对应表示真、假。
但,其他编程语言像 C++、java 都设计有布尔数类型。 C语言在1999 年推出的新标准(C99)中,也加入了 布尔类型。用 true 来代表 1,为真;用 false 来代表 0,为假。使用时,需要引入头文件 #include <stdbool.h>
4.2.3 实型
实型表示有符号的十进制小数,在计算机内部以浮点方式表示(小数点是浮动的),因此也叫浮点型。
常见实型有两种: float (单精度)、 double (双精度)
实型数据没有八、十六进制,也没有 unsigned 无符号形式。在计算机底层采用的是近似计算,实现比较复杂,且不同平台处理方式不同。我们这里只学习它基本的知识。
| 类型 | 字节数 | 格式符 | 有效数字 | 常量后缀 |
|---|---|---|---|---|
| float (单精度) | 4 | %f | 6~7 | f |
| double (双精度) | 8 | %lf | 15~16 | 无 |
4.2.4 字符型
C 语言定义 char 类型来表示字符数据。 其本质依然是存储数值,因此与数值型类似,也有有符号、无符号之分。占用 1 个字节内存大小。
| 类型 | 字节数 | 格式符 | 数据范围 | 最小值宏 | 最大值宏 |
|---|---|---|---|---|---|
| char | 1 | %hhd | -27 ~ 27-1 (-128 ~ 127) | CHAR_MIN | CHAR_MAX |
| unsigned char | 1 | %hhu | 0~28-1 (0 ~ 255) | 0 | UCHAR_MAX |
4.3ASCII 码
char 类型在程序中,最常用来表示字符。其本质依然是一个数字,但每个值都对应一个固定的字符,共定义了128个字符。称之为 ASCII 码 (American Standard Code for Information Interchange) 美国信息交换标准代码。
| ASCII值 | 控制字符 | ASCII值 | 字符 | ASCII值 | 字符 | ASCII值 | 字符 |
|---|---|---|---|---|---|---|---|
| 0 | NUL | 32 | (space) | 64 | @ | 96 | 、 |
| 1 | SOH | 33 | ! | 65 | A | 97 | a |
| 2 | STX | 34 | “ | 66 | B | 98 | b |
| 3 | ETX | 35 | # | 67 | C | 99 | c |
| 4 | EOT | 36 | $ | 68 | D | 100 | d |
| 5 | ENQ | 37 | % | 69 | E | 101 | e |
| 6 | ACK | 38 | & | 70 | F | 102 | f |
| 7 | BEL | 39 | ‘ | 71 | G | 103 | g |
| 8 | BS | 40 | ( | 72 | H | 104 | h |
| 9 | HT | 41 | ) | 73 | I | 105 | i |
| 10 | LF | 42 | * | 74 | J | 106 | j |
| 11 | VT | 43 | + | 75 | K | 107 | k |
| 12 | FF | 44 | , | 76 | L | 108 | l |
| 13 | CR | 45 | - | 77 | M | 109 | m |
| 14 | SO | 46 | . | 78 | N | 110 | n |
| 15 | SI | 47 | / | 79 | O | 111 | o |
| 16 | DLE | 48 | 0 | 80 | P | 112 | p |
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q |
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r |
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s |
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t |
| 21 | NAK | 53 | 5 | 85 | U | 117 | u |
| 22 | SYN | 54 | 6 | 86 | V | 118 | v |
| 23 | TB | 55 | 7 | 87 | W | 119 | w |
| 24 | CAN | 56 | 8 | 88 | X | 120 | x |
| 25 | EM | 57 | 9 | 89 | Y | 121 | y |
| 26 | SUB | 58 | : | 90 | Z | 122 | z |
| 27 | ESC | 59 | ; | 91 | [ | 123 | { |
| 28 | FS | 60 | < | 92 | \ | 124 | | |
| 29 | GS | 61 | = | 93 | ] | 125 | } |
| 30 | RS | 62 | > | 94 | ^ | 126 | ~ |
| 31 | US | 63 | ? | 95 | _ | 127 | DEL |
上表中有 6 个字符对应的 ASCII 较为常见,建议大家记下,会为后续写代码提供很多方便。
| 字符 | ASCII 码 | 字符 | ASCII 码 |
|---|---|---|---|
| 空 | 0 | ‘\n’ | 10 |
| 空格 | 32 | 0 | 48 |
| A | 65 | a | 97 |
需注意的是,我们从键盘键入的所有内容都是字符。如,键入数字 7,实际是字符 ‘7’,真正存储在计算机内的是 55(字符 7 的 ASCII 码值),而如果我们键入了 35,实际上这是两个字符。真正存储在计算机内的是 51 和 53(字符 3 和 字符 5 的 ASCII 码值)。
我们可以用 printf 结合 格式符 %c,显示字符。 如果用 %d,就显示 其 ASCII 值了。
4.4转义字符
C 语言提供了一类特殊的字符,是由 \ 和特定字符组合而成,称之为 转义字符。他们都是 ==一个== 字符,如:
- ‘\n’ 这是 1 个字符。 代表 回车换行(回车键)。
- ‘\t’ 也是 1 个字符。代表 制表符 (Tab键)。
- ‘\b’ 同样是 1 个字符。 代表 退格符(Backspace 键)。
- ‘\0’ 是一个字符。代表 空。对应 ASCII 值 0。
- ‘\ddd’ 是一个字符。ddd 对应 3 个八进制数(没有用 0 开头)。 如:\141 对应 ASCII 值为 97,代表 ‘a’。
- ‘\xhh’ 是一个字符。x 表十六进制,hh 对应 2 个十六进制数。 如:\x41 对应 ASCII 值为 65,代表 ‘A’。
\ 还可以在特定环境下,将一个字符还原其本身意。
比如,现在想在 printf(“%d\n”,10);输出 10 的时候,用 “” 把 10 包裹住。 如果直接写 printf(“ “%d” \n”,10);是会报错的。这时,可以使用 \" 将 “ 进行转义,还原其本身意。
4.5字符输入输出
C 语言提供了专门的函数,方便在程序中 获取、输出 字符数据。
getchar():获取用户从键盘写入的一个字符。
- 程序执行到 getchar() 会暂停,等待用户键入字符数据。
- 一次 getchar() 调用,只读取一个字符。如用户键入多个字符,需要多次调用 getchar()读取。
- 函数调用完成,会返回实际读到的字符 对应的 ASCII 值。
- 用户键入字符结束,敲的回车键,对应‘\n’ 字符,也可以使用 getchar() 读取。
1
int ret = getchar();putchar(ch):将 ch 对应的字符,输出到屏幕。
- ch 可以是变量也可以是常量。
- 一次 putchar() 调用,只写出一个字符(不含换行符 ‘\n’)。
- 函数调用完成,会返回实际写出的字符 对应的 ASCII 值。
1
2char ch = 'A';
int ret = putchar(ch);
五.scanf 输入
目标:接收用户输入数据
我们可以借助 getchar() 读取用键入的字符数据。 如果想要读取其他数据怎么办呢?C语言提供了 scanf() 函数,可以结合 格式符 读取各种类型数据。
作用:从标准输入设备(键盘)上按格式获取数据。
语法:scanf(“格式控制字符串“, ……); 需指定头文件 #include <stdio.h>
- 参 1: 必须是字符串,且必须包含 格式说明符(占位符)
- 格式符 与 数据类型中使用方式一致。 常用的有 %d、%c、%f、%lf 等。
- 后续参数(变参):个数,直接受 参 1 格式匹配符影响。
- 对应 格式符的 必须是 变量地址(&变量名,可取变量地址),代表数据存放位置。
- 参 1: 必须是字符串,且必须包含 格式说明符(占位符)
示例:
1
2
3
4
5
6
7printf(“请输入一个字符:”); // 借助 printf 提示用户输入
char ch = 0; // 准备变量,存储数据
scanf("%c", &ch); // 使用变量地址,与 格式符对应
printf(“请输入三个整数,用逗号间隔:”);
int a, b, c; // 可以不赋初值。
scanf("%d,%d,%d", &a, &b, &c);
5.1 注意事项
不要在 scanf 的参 1 中,添加类似 printf() 的提示字符串和 \n 换行符。
键入数据时,数据个数、类型、顺序,必须与参 1 中占位符一一对应。
键入数据时,数据间的分割符,必须与 参 1 中 占位符的分割符一致。
scanf 的返回值,代表格式符成功匹配数据的次数。(较少使用)
VS2019 以后的版本编译时,会将 scanf 划为 “不安全函数”,爆出C4996 错误,推荐你使用 s_scanf() 函数。
但,学习、练习、测试时,直接使用 scanf 很方便,可暂时屏蔽该错误。
- 方法 1:在项目中设置:工程名→右键→属性→C/C++→预处理器→预处理器定义→编辑→将 _CRT_SECURE_NO_WARNINGS 加入“预处理定义” 中
- 方法 2:在每个.c文件开头(第一行)添加宏:#define _CRT_SECURE_NO_WARNINGS
六.类型转换
6.1隐式类型转换
编译器自动完成。 (小类型转大类型,同类型大小)

由赋值产生。
1 | |
小类型 ——> 大类型: 没问题。
大类型 ——> 小类型。可能丢失数据。
VS中 Ctrl+F7 只编译,检查语法错误,不运行。
1 | |
321: 28 = 256 有, 128 没有, 64 有, 32/16/8/4/2 没有, 有1
0000 0000 0000 0000 0000 0001 0100 0001 —— 321 二进制表现形式。
0000 0000 —— char 只有一个字节。
赋值后,char值为:0100 0001 — 1 + 64 = 65
6.2强制类型转换
语法:
- 强转变量: (目标类型)变量
- 强转表达式:(目标类型)表达式
1 | |
笔记来源:黑马程序员;菜鸟教程