Part 1 基础介绍
1. 第一个C语言程序:HelloWorld
1.1 编写C语言代码:hello.c
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
C语言的源代码文件是一个普通的文本文件,但扩展名必须是.c。
1.2代码分析
1)include 头文件
- #include的意思是头文件包含,#include <stdio.h>代表包含stdio.h这个头文件
- 使用C语言库函数需要提前包含库函数对应的头文件,如这里使用了printf()函数,需要包含stdio.h头文件
- 可以通过man 3 printf查看printf所需的头文件
#include< > 与 #include ""的区别:
2)main函数
- 一个完整的C语言程序,是由一个、且只能有一个main()函数(又称主函数,必须有)和若干个其他函数结合而成(可选)。
- main函数是C语言程序的入口,程序是从main函数开始执行。
3){ } 括号、程序块和代码块
- { }叫代码块,一个代码块内部可以有一条或者多条语句
- C语言每句可执行代码都是";"分号结尾
- 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
- 所有的可执行语句必须是在代码块里面
4)注释
- //叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读
- /**/叫块注释
- 块注释是C语言标准的注释方法
- 行注释是从C++语言借鉴过来的
5)printf函数
- printf是C语言库函数,功能是向标准输出设备输出一个字符串
- printf(“hello world\n”); // \n的意思是回车换行
6)return函数
- return代表函数执行完毕,返回return代表函数的终止
- 如果main定义的时候前面是int,那么return后面就需要写一个整数;如果main定义的时候前面是void,那么return后面什么也不需要写
- 在main函数中return 0代表程序执行成功,return -1代表程序执行失败
- int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式
1.3编译过程
1.3.1 C语言编译步骤
C代码编译成可执行程序经过4步:
- 预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
- 编译:检查语法,将预处理后文件编译生成汇编文件
- 汇编:将汇编文件生成目标文件(二进制文件)
- 链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

1.4 CPU内部结构与寄存器
1.5 集成开发环境IDE
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。
1.5.1 Microsoft Visual Studio
Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等,所写的目标代码适用于微软支持的所有平台。Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。
**VS常用快捷键 **
快捷键 | 含义 |
---|
Ctrl + k,Ctrl + f | 自动格式化代码 | Ctrl + k,Ctrl + c | 注释代码 | Ctrl + k,Ctrl + u | 取消注释代码 | F9 | 设置断点 | F5 | 调试运行 | Ctrl + F5 | 不调试运行 | Ctrl + Shift + b | 编译,不运行 | F10 | next调试 | F11 | step调试 |
Part 2 数据类型
2.1 常量与变量
2.1.1 关键字
C语言共有32个关键字。
char ,short, int, long, float, double, unsigned, signed, struct, union,enum, void,
if, else, swith,case, default,for, do, while, break, continue, goto, return,
auto, extern, register,static,const
sizeof,typedef,volatile
2.1.2 数据类型
数据类型的作用:编译器预算对象(变量)分配的内存空间大小。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dNRzydVB-1627308486734)(file:///C:/Users/t480s/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]
2.1.3 常量
- 在程序运行过程中,其值不能被改变的量
- 常量一般出现在表达式或赋值语句中
类型 | 示例 |
---|
整型常量 | 100,200,-100,0 | 实型常量 | 3.14 , 0.125,-3.123 | 字符型常量 | ‘a’,‘b’,‘1’,‘\n’ | 字符串常量 | “a”,“ab”,“12356” |
2.1.4 变量
1)变量
- 在程序运行过程中,其值可以改变
- 变量在使用前必须先定义,定义变量前必须有相应的数据类型
标识符命名规则:
- 标识符不能是关键字
- 标识符只能由字母、数字、下划线组成
- 第一个字符必须为字母或下划线
- 标识符中字母区分大小写
变量特点:
- 变量在编译时为其分配相应的内存空间
- 可以通过其名字和地址访问相应内存

2)声明和定义区别
- 声明变量不需要建立存储空间,如:extern int a;
- 定义变量需要建立存储空间,如:int b;
#include <stdio.h>
int main()
{
extern int a;
a = 10;
int b = 10;
return 0;
}
从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义:
- int b 它既是声明,同时又是定义
- 对于 extern b来讲它只是声明不是定义
一般的情况下,把建立存储空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。
#include <stdio.h>
#define MAX 10
int main()
{
int a;
const int b = 10;
a = MAX;
a = 123;
printf("%d\n", a);
return 0;
}
2.2整型 :int
2.2.1整型变量的定义和输出
打印格式 | 含义 |
---|
%d | 输出一个有符号的10进制int类型 | %o(字母o) | 输出8进制的int类型 | %x | 输出16进制的int类型,字母以小写输出 | %X | 输出16进制的int类型,字母以大写输出 | %u | 输出一个10进制的无符号数 |
#include <stdio.h>
int main()
{
int a = 123;
int b = 0567;
int c = 0xabc;
printf("a = %d\n", a);
printf("8进制:b = %o\n", b);
printf("10进制:b = %d\n", b);
printf("16进制:c = %x\n", c);
printf("16进制:c = %X\n", c);
printf("10进制:c = %d\n", c);
unsigned int d = 0xffffffff;
printf("有符号方式打印:d = %d\n", d);
printf("无符号方式打印:d = %u\n", d);
return 0;
}
2.2.2整型变量的输入
#include <stdio.h>
int main()
{
int a;
printf("请输入a的值:");
scanf("%d", &a);
printf("a = %d\n", a);
return 0;
}
2.2.3 short、int、long、long long
数据类型 | 占用空间 |
---|
short(短整型) | 2字节 | int(整型) | 4字节 | long(长整形) | Windows为4字节,Linux为4字节(32位),8字节(64位) | long long(长长整形) | 8字节 |
- 需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然 C 语言标准中没有明确规定整型数据的长度,但 long 类型整数的长度不能短于 int 类型, short 类型整数的长度不能长于 int 类型。
- 当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化。但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。
整型常量 | 所需类型 |
---|
10 | 代表int类型 | 10l, 10L | 代表long类型 | 10ll, 10LL | 代表long long类型 | 10u, 10U | 代表unsigned int类型 | 10ul, 10UL | 代表unsigned long类型 | 10ull, 10ULL | 代表unsigned long long类型 |
打印格式 | 含义 |
---|
%hd | 输出short类型 | %d | 输出int类型 | %ld | 输出long类型 | %lld | 输出long long类型 | %hu | 输出unsigned short类型 | %u | 输出unsigned int类型 | %lu | 输出unsigned long类型 | %llu | 输出unsigned long long类型 |
#include <stdio.h>
int main()
{
short a = 10;
int b = 10;
long c = 10l;
long long d = 10ll;
printf("sizeof(a) = %u\n", sizeof(a));
printf("sizeof(b) = %u\n", sizeof(b));
printf("sizeof(c) = %u\n", sizeof(c));
printf("sizeof(c) = %u\n", sizeof(d));
printf("short a = %hd\n", a);
printf("int b = %d\n", b);
printf("long c = %ld\n", c);
printf("long long d = %lld\n", d);
unsigned short a2 = 20u;
unsigned int b2 = 20u;
unsigned long c2= 20ul;
unsigned long long d2 = 20ull;
printf("unsigned short a = %hu\n", a2);
printf("unsigned int b = %u\n", b2);
printf("unsigned long c = %lu\n", c2);
printf("unsigned long long d = %llu\n", d2);
return 0;
}
2.2.4 有符号数和无符号数区别
1)有符号数
有符号数是最高位为符号位,0代表正数,1代表负数。
#include <stdio.h>
int main()
{
signed int a = -1089474374;
printf("%X\n", a);
return 0;
}
2)无符号数
无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。
#include <stdio.h>
int main()
{
unsigned int a = 3236958022;
printf("%X\n", a);
return 0;
}
当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。
3)有符号和无符号整型取值范围
数据类型 | 占用空间 | 取值范围 |
---|
short | 2字节 | -32768 到 32767 (-215 ~ 215-1) | int | 4字节 | -2147483648 到 2147483647 (-231 ~ 231-1) | long | 4字节 | -2147483648 到 2147483647 (-231 ~ 231-1) | unsigned short | 2字节 | 0 到 65535 (0 ~ 216-1) | unsigned int | 4字节 | 0 到 4294967295 (0 ~ 232-1) | unsigned long | 4字节 | 0 到 4294967295 (0 ~ 232-1) |
2.3 sizeof关键字
- sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
- sizeof的返回值为size_t
- size_t类型在32位操作系统下是unsigned int,是一个无符号的整数
#include <stdio.h>
int main()
{
int a;
int b = sizeof(a);
printf("b = %d\n", b);
size_t c = sizeof(a);
printf("c = %u\n", c);
return 0;
}
2.4字符型
2.4.1 字符变量的定义和输出
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用**一对英文半角格式的单引号(’ ')**把字符括起来。
字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
#include <stdio.h>
int main()
{
char ch = 'a';
printf("sizeof(ch) = %u\n", sizeof(ch));
printf("ch[%%c] = %c\n", ch);
printf("ch[%%d] = %d\n", ch);
char A = 'A';
char a = 'a';
printf("a = %d\n", a);
printf("A = %d\n", A);
printf("A = %c\n", 'a' - 32);
printf("a = %c\n", 'A' + 32);
ch = ' ';
printf("空字符:%d\n", ch);
printf("A = %c\n", 'a' - ' ');
printf("a = %c\n", 'A' + ' ');
return 0;
}
2.4.2字符变量的输入
#include <stdio.h>
int main()
{
char ch;
printf("请输入ch的值:");
//不要加“\n”
scanf("%c", &ch);
printf("ch = %c\n", ch); //打印ch的字符
return 0;
}
2.4.3 ASCII对照表
ASCII值 | 控制字符 | ASCII值 | 字符 | ASCII值 | 字符 | ASCII值 | 字符 |
---|
0 | NUT | 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 |
ASCII 码大致由以下两部分组成:
- ASCII 非打印控制字符: ASCII 表上的数字 0-31 分配给了控制字符,用于控制像打印机等一些外围设备。
- ASCII 打印字符:数字 32-126 分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。数字 127 代表 Del 命令。
2.4.4 转义字符
转义字符 | 含义 | ASCII****码值(十进制) |
---|
\a | 警报 | 007 | \b | 退格(BS) ,将当前位置移到前一列 | 008 | \f | 换页(FF),将当前位置移到下页开头 | 012 | \n | 换行(LF) ,将当前位置移到下一行开头 | 010 | \r | 回车(CR) ,将当前位置移到本行开头 | 013 | \t | 水平制表(HT) (跳到下一个TAB位置) | 009 | \v | 垂直制表(VT) | 011 | \ | 代表一个反斜线字符"" | 092 | ’ | 代表一个单引号(撇号)字符 | 039 | " | 代表一个双引号字符 | 034 | ? | 代表一个问号 | 063 | \0 | 数字0 | 000 | \ddd | 8进制转义字符,d范围0~7 | 3位8进制 | \xhh | 16进制转义字符,h范围09,af,A~F | 3位16进制 |
#include <stdio.h>
int main()
{
printf("abc");
printf("\refg\n");
printf("abc");
printf("\befg\n");
printf("%d\n", '\123');
printf("%d\n", '\x23');
return 0;
}
2.5实型(浮点型):float、double
实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确。
由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。
#include <stdio.h>
int main()
{
float a = 3.14f;
double b = 3.14;
printf("a = %f\n", a);
printf("b = %lf\n", b);
a = 3.2e3f;
printf("a1 = %f\n", a);
a = 100e-3f;
printf("a2 = %f\n", a);
a = 3.1415926f;
printf("a3 = %f\n", a);
return 0;
}
2.6进制
进制也就是进位制,是人们规定的一种进位方法。 对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
十进制 | 二进制 | 八进制 | 十六进制 |
---|
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 2 | 10 | 2 | 2 | 3 | 11 | 3 | 3 | 4 | 100 | 4 | 4 | 5 | 101 | 5 | 5 | 6 | 110 | 6 | 6 | 7 | 111 | 7 | 7 | 8 | 1000 | 10 | 8 | 9 | 1001 | 11 | 9 | 10 | 1010 | 12 | A | 11 | 1011 | 13 | B | 12 | 1100 | 14 | C | 13 | 1101 | 15 | D | 14 | 1110 | 16 | E | 15 | 1111 | 17 | F | 16 | 10000 | 20 | 10 |
2.6.1 二进制
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。
当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。
术语 | 含义 |
---|
bit(比特) | 一个二进制代表一位,一个位只能表示0或1两种状态。数据传输是习惯以“位”(bit)为单位。 | Byte(字节) | 一个字节为8个二进制,称为8位,计算机中存储的最小单位是字节。数据存储是习惯以“字节”(Byte)为单位。 | WORD(双字节) | 2个字节,16位 | DWORD | 两个WORD,4个字节,32位 | 1b | 1bit,1位 | 1B | 1Byte,1字节,8位 | 1k,1K | 1024 | 1M(1兆) | 1024k, 1024*1024 | 1G | 1024M | 1T | 1024G | 1Kb(千位) | 1024bit,1024位 | 1KB(千字节) | 1024Byte,1024字节 | 1Mb(兆位) | 1024Kb = 1024 * 1024bit | 1MB(兆字节) | 1024KB = 1024 * 1024Byte |
十进制转化二进制的方法:用十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A0DnN1Fs-1627308486738)(file:///C:/Users/t480s/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png)]](https://img-blog.csdnimg.cn/102869f4cf5d4214a35dc02aa30bfa88.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NzY0ODY3,size_16,color_FFFFFF,t_70)
十进制的小数转换成二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。 
2.6.2 八进制
八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。
八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。 
2.6.3 十六进制
十六进制(英文名称:Hexadecimal),同我们日常生活中的表示法不一样,它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9,A-F对应10-15。
十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位),因此常应用在计算机语言中。
2.6.4 C语言如何表示相应进制数
十进制 | 以正常数字1-9开头,如123 |
---|
八进制 | 以数字0开头,如0123 | 十六进制 | 以0x开头,如0x123 | 二进制 | C语言不能直接书写二进制数 |
#include <stdio.h>
int main()
{
int a = 123;
int b = 0123;
int c = 0xABC;
printf("十进制:%d\n",a );
printf("八进制:%o\n", b);
printf("十六进制:%x\n", c);
return 0;
}
2.7 计算机内存数值存储方式
2.8类型限定符
限定符 | 含义 |
---|
extern | 声明一个变量,extern声明的变量没有建立存储空间。 extern int a;//变量在定义的时候创建存储空间 | const | 定义一个常量,常量的值不能修改。 const int a = 10; | Volatile | 防止编译器优化代码 | register | 定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。 |
2.9字符串格式化输出和输入
2.9.1 字符串常量
- 字符串是内存中一段连续的char空间,以’\0’(数字0)结尾。
- 字符串常量是由**双引号**括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
字符串常量与字符常量的不同:
 每个字符串的结尾,编译器会自动的添加一个结束标志位’\0’,即 “a” 包含两个字符’a’和’\0’。
2.9.2 printf函数和putchar函数
printf是输出一个字符串,putchar输出一个char。
printf格式字符:
打印格式 | 对应数据类型 | 含义 |
---|
%d | int | 接受整数值并将它表示为有符号的十进制整数 | %hd | short int | 短整数 | %hu | unsigned short | 无符号短整数 | %o | unsigned int | 无符号8进制整数 | %u | unsigned int | 无符号10进制整数 | %x,%X | unsigned int | 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF | %f | float | 单精度浮点数 | %lf | double | 双精度浮点数 | %e,%E | double | 科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写 | %c | char | 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 | %s | char * | 字符串。输出字符串中的字符直至字符串中的空字符(字符串以’\0‘结尾,这个’\0’即空字符) | %p | void * | 以16进制形式输出指针 | %% | % | 输出一个百分号 |
printf附加格式:
字符 | 含义 |
---|
l(字母l) | 附加在d,u,x,o前面,表示长整数 | - | 左对齐 | m(代表一个整数) | 数据最小宽度 | 0(数字0) | 将输出的前面补上0直到占满指定列宽为止不可以搭配使用- | m.n(代表一个整数) | m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。 |
#include <stdio.h>
int main()
{
int a = 100;
printf("a = %d\n", a);
printf("%p\n", &a);
printf("%%d\n");
char c = 'a';
putchar(c);
long a2 = 100;
printf("%ld, %lx, %lo\n", a2, a2, a2);
long long a3 = 1000;
printf("%lld, %llx, %llo\n", a3, a3, a3);
int abc = 10;
printf("abc = '%6d'\n", abc);
printf("abc = '%-6d'\n", abc);
printf("abc = '%06d'\n", abc);
printf("abc = '%-06d'\n", abc);
double d = 12.3;
printf("d = \' %-10.3lf \'\n", d);
return 0;
}
2.9.3 scanf函数与getchar函数
- getchar是从标准输入设备读取一个char。
- scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。
#include <stdio.h>
int main()
{
char ch1;
char ch2;
char ch3;
int a;
int b;
printf("请输入ch1的字符:");
ch1 = getchar();
printf("ch1 = %c\n", ch1);
getchar();
printf("请输入ch2的字符:");
ch2 = getchar();
printf("\'ch2 = %ctest\'\n", ch2);
getchar();
printf("请输入ch3的字符:");
scanf("%c", &ch3);
printf("ch3 = %c\n", ch3);
printf("请输入a的值:");
scanf("%d", &a);
printf("a = %d\n", a);
printf("请输入b的值:");
scanf("%d", &b);
printf("b = %d\n", b);
return 0;
}
Part 3 运算符与表达式
3.1常用运算符分类
运算符类型 | 作用 |
---|
算术运算符 | 用于处理四则运算 | 赋值运算符 | 用于将表达式的值赋给变量 | 比较运算符 | 用于表达式的比较,并返回一个真值或假值 | 逻辑运算符 | 用于根据表达式的值返回真值或假值 | 位运算符 | 用于处理数据的位运算 | sizeof运算符 | 用于求字节数长度 |
3.2 算术运算符
运算符 | 术语 | 示例 | 结果 |
---|
+ | 正号 | +3 | 3 | - | 负号 | -3 | -3 | + | 加 | 10 + 5 | 15 | - | 减 | 10 - 5 | 5 | * | 乘 | 10 * 5 | 50 | / | 除 | 10 / 5 | 2 | % | 取模(取余) | 10 % 3 | 1 | ++ | 前自增 | a=2; b=++a; | a=3; b=3; | ++ | 后自增 | a=2; b=a++; | a=3; b=2; | – | 前自减 | a=2; b=–a; | a=1; b=1; | – | 后自减 | a=2; b=a–; | a=1; b=2; |
3.3 赋值运算符
运算符 | 术语 | 示例 | 结果 |
---|
= | 赋值 | a=2; b=3; | a=2; b=3; | += | 加等于 | a=0; a+=2; | a=2; | -= | 减等于 | a=5; a-=3; | a=2; | *= | 乘等于 | a=2; a*=2; | a=4; | /= | 除等于 | a=4; a/=2; | a=2; | %= | 模等于 | a=3; a%2; | a=1; |
3.4比较运算符
C 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示。
运算符 | 术语 | 示例 | 结果 |
---|
== | 相等于 | 4 == 3 | 0 | != | 不等于 | 4 != 3 | 1 | < | 小于 | 4 < 3 | 0 | > | 大于 | 4 > 3 | 1 | <= | 小于等于 | 4 <= 3 | 0 | >= | 大于等于 | 4 >= 1 | 1 |
3.5 逻辑运算符
运算符 | 术语 | 示例 | 结果 |
---|
! | 非 | !a | 如果a为假,则!a为真; 如果a为真,则!a为假。 | && | 与 | a && b | 如果a和b都为真,则结果为真,否则为假。 | || | 或 | a || b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 |
3.6 运算符优先级
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
---|
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | – | | () | 圆括号 | (表达式)/函数名(形参表) | – | | 2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 | | ~ | 按位取反运算符 | ~表达式 | | | | ++ | 自增运算符 | ++变量名/变量名++ | | | | – | 自减运算符 | –变量名/变量名– | | | | ***** | 取值运算符 | *指针变量 | | | | & | 取地址运算符 | &变量名 | | | | ! | 逻辑非运算符 | !表达式 | | | | (类型) | 强制类型转换 | (数据类型)表达式 | – | | | sizeof | 长度运算符 | sizeof(表达式) | – | | 3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 | | ***** | 乘 | 表达式*表达式 | | | | % | 余数(取模) | 整型表达式%整型表达式 | | | 4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 | | - | 减 | 表达式-表达式 | | | 5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 | | >> | 右移 | 变量>>表达式 | | | 6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 | | >= | 大于等于 | 表达式>=表达式 | | | | < | 小于 | 表达式<表达式 | | | | <= | 小于等于 | 表达式<=表达式 | | | 7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 | | != | 不等于 | 表达式!= 表达式 | | | 8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 | 9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 | 10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 | 11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 | 12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 | | | | | | | 13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 | 14 | = | 赋值运算符 | 变量=表达式 | 右到左 | – | | /= | 除后赋值 | 变量/=表达式 | – | | | *= | 乘后赋值 | 变量*=表达式 | – | | | %= | 取模后赋值 | 变量%=表达式 | – | | | += | 加后赋值 | 变量+=表达式 | – | | | -= | 减后赋值 | 变量-=表达式 | – | | | <<= | 左移后赋值 | 变量<<=表达式 | – | | | >>= | 右移后赋值 | 变量>>=表达式 | – | | | &= | 按位与后赋值 | 变量&=表达式 | – | | | ^= | 按位异或后赋值 | 变量^=表达式 | – | | | |= | 按位或后赋值 | 变量|=表达式 | – | | 15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | – |
3.7类型转换
转换的方法有两种:
- 自动转换(隐式转换):遵循一定的规则,由编译系统自动完成。
- 强制类型转换:把表达式的运算结果强制转换成所需的数据类型。
类型转换的原则:占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。

3.7.1 隐式转换
#include <stdio.h>
int main()
{
int num = 5;
printf("s1=%d\n", num / 2);
printf("s2=%lf\n", num / 2.0);
return 0;
}
3.7.2 强制转换
强制类型转换指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,其基本语法格式如下所示:
#include <stdio.h>
int main()
{
float x = 0;
int i = 0;
x = 3.6f;
i = x;
i = (int)x;
printf("x=%f, i=%d\n", x, i);
return 0;
}
Part 4 程序流程结构
4.1概述
C语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。
- 顺序结构:程序按顺序执行,不发生跳转。
- 选择结构:依据是否满足条件,有选择的执行相应功能。
- 循环结构:依据条件是否满足,循环多次执行某段代码。
4.2选择结构
4.2.1 if 语句

#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
if (a > b)
{
printf("%d\n", a);
}
return 0;
}
4.2.2 if else

#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
if (a > b)
{
printf("%d\n", a);
}
else
{
printf("%d\n", b);
}
return 0;
}
4.2.3 三目运算符
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int c;
if (a > b)
{
c = a;
}
else
{
c = b;
}
printf("c1 = %d\n", c);
a = 1;
b = 2;
c = ( a > b ? a : b );
printf("c2 = %d\n", c);
return 0;
}
4.2.4 switch语句
#include <stdio.h>
int main()
{
char c;
c = getchar();
switch (c)
{
case '1':
printf("OK\n");
break;
case '2':
printf("not OK\n");
break;
default:
printf("are u ok?\n");
}
return 0;
}
4.3循环结构
4.3.1 while 语句

#include <stdio.h>
int main()
{
int a = 20;
while (a > 10)
{
scanf("%d", &a);
printf("a = %d\n", a);
}
return 0;
}
4.3.2 do while语句
#include <stdio.h>
int main()
{
int a = 1;
do
{
a++;
printf("a = %d\n", a);
} while (a < 10);
return 0;
}
4.3.3 for 语句
#include <stdio.h>
int main()
{
int i;
int sum = 0;
for (i = 0; i <= 100; i++)
{
sum += i;
}
printf("sum = %d\n", sum);
return 0;
}
4.3.4 嵌套结构
循环语句之间可以相互嵌套:
#include <stdio.h>
int main()
{
int num = 0;
int i, j, k;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
for (k = 0; k < 10; k++)
{
printf("hello world\n");
num++;
}
}
}
printf("num = %d\n", num);
return 0;
}
4.4 跳转语句 break、continue、goto
4.3.1 break 语句
在switch条件语句和循环语句中都可以使用break语句:
-
当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。 -
当它出现在循环语句中,作用是跳出当前内循环语句,执行后面的代码。 -
当它出现在嵌套循环语句中,跳出最近的内循环语句,执行后面的代码。 #include <stdio.h>
int main()
{
int i = 0;
while (1)
{
i++;
printf("i = %d\n", i);
if (i == 10)
{
break;
}
}
int flag = 0;
int m = 0;
int n = 0;
for (m = 0; m < 10; m++)
{
for (n = 0; n < 10; n++)
{
if (n == 5)
{
flag = 1;
break;
}
}
if (flag == 1)
{
break;
}
}
return 0;
}
4.3.2 continue语句 在循环语句中,如果希望立即终止本次循环,并执行下一次循环,此时就需要使用continue语句。 #include<stdio.h>
int main()
{
int sum = 0;
for (int i = 1; i <= 100; i++)
{
if (i % 2 == 0)
{
continue;
}
sum += i;
}
printf("sum = %d\n", sum);
return 0;
}
4.3.3 goto语句(无条件跳转,尽量少用) #include <stdio.h>
int main()
{
goto End;
printf("aaaaaaaaa\n");
End:
printf("bbbbbbbb\n");
return 0;
}
参考
https://space.bilibili.com/37974444?spm_id_from=333.788.b_765f7570696e666f.1
|