type
status
date
slug
summary
tags
category
icon
password
一、C语言的简介
什么是C语言
C语言之父
C语言的由来
C语言的发展
为什么要学C语言/能做什么
为什么要学习这套C语言
本套课程适用人群
课程内容介绍
1、C语言标准
1.1 标准简史
- 1972年C语⾔在⻉尔实验室诞⽣. 丹尼斯·⾥奇 参考B语⾔开发.
- 1970-80年代,C语⾔被⼴泛应⽤,产⽣很多不同的C语⾔版本. 程序可移植性⽐较差.
- 1983年,美国国家标准委员会(ANSI) 成⽴⼀个⼩组来制定C语⾔的标准. C语⾔⽀持哪些语法、⽀持哪些功能 等等.
- 1989年,通过了C语⾔的第⼀个标准. C89标准.
- 1990年,国际标准化组织(ISO) 和 国际电⼯委员会(IEC) 将 C89标准当做国际的C语⾔标准. C90标准. C89和 C90指的是同⼀个标准
- 1994年 ISO和 IEC 对 C89标准进⾏修订. C94标准. 由于并没有增加新的语法特性,还是叫做 C89或者C90.
- 1995年 ISO和IEC再次做了修正,C95 标准.
- 1999年 ISO 和 IEC 发布了C语⾔新标准. C语⾔第⼆个标准. 在该标准中,新增许多实⽤的C语⾔语法特性. 增 加新的关键字、可变⻓数组等等. C99标准
- 2007年,重新修订了C语⾔.
- 2011年, 发布新的版本。新增了⼀些语法,泛型、国际化⽀持. ⽬前为⽌最新版本是 C11.
1.2 标准的影响
- 可将C语⾔的标准理解为C语⾔说明书。但其并没有强制性约束⼒。
如:微软拿到标准,认为有些标准不合理,不⽀持。微软认为某些特性⾮常好,但标准中没有,微软可以修改标准,新增语法.
- 如果编译器不⽀持标准,我们即使使⽤标准中的语法仍然会报错。
- 编译器版本也会影响程序。因此,编写程序之前要确定编译器版本。
1.3 常见的C/C++编译器:
- Borland C++ 宝蓝公司
- Intel C++ 英特尔编译器
- VC++ 微软公司
- g++编译器(gcc是编译套件), Linux 默认使⽤的编译器. 对标准⽀持最好.
###1.4 C语⾔的优缺点
1.4.1 优点:
- 学习成本低。
- 运⾏速度快。
- 功能强⼤。
1.4.2 缺点:
- 代码实现周期⻓
- 可移植性差
- 对经验要求⾼
- 对平台库依赖多
1.5 C语言的应用领域
- 服务器。
- 操作系统。
- 上层应⽤。 MFC、QT
- 嵌⼊式。
- ⼈⼯智能、硬件驱动。
- 中间件。
- ⽹络攻防、数据安全。
- ⼤学必修课。
- 名企、外企。
2、常见开发工具
- Windows操作系统
vs(visual studio)2013、2015、2017、2019、2022
Clion:跨平台IDE、跟Java的IDEA、python的pycharm是同一家公司的
Qt Creator 跨平台IDE
- MacOS(苹果电脑的操作系统)
Xcode
Clion:跨平台IDE。
Qt Creator 跨平台IDE。
- Linux:
vi/vim —— ⽂本编辑器。
Clion:跨平台IDE。
Qt Creator 跨平台IDE。
备注:大多企业开发用vs会更多一些
第一个程序
1.1 环境搭建:
- 打开微软的官方网站 https://visualstudio.microsoft.com/,下载 Visual Studio 安装包。
- 双击安装包进行安装
- *操作一:**在 “工作负荷” 标签页中,选择 “使用 C++的桌面开发” 选项即可。
操作二:“安装位置” 中修改安装路径。
路径的要求:
1,不要有中文,不要有空格,不要有一些特殊符号
2,选择一个统一的文件夹进行管理
- 自动下载并安装,过程略微漫长,耐心等待。
- 安装完成,弹出 “安装完毕” 对话框。 点击确定。
- 接下来,VS希望你使用微软的账号登录,没有可以注册一个。也可以点击“暂时跳过此项”。
- 根据提示选择一个自己喜欢的主题
- 点击启动,到此整个环境全部搭建完毕
1.2 第一个代码HelloWorld
- 创建项目
点击 “创建新项目”,创建一个项目。
- 选择创建 “控制台应用”,点击下一步。
- 指定项目名称。确保位置下的项目存储目录存在。 勾选 “将解决方案和项目.....” ,点击 “创建”。
- 右侧的解决方案管理器可以按照自己的习惯是放在左侧或者右侧
默认是右侧,可以拖到左侧来,每个人的习惯不同,没有固定标准
- 创建 helloworld.c ⽂件
右键选择原文件,选择添加,选择新建项
- 在弹出的编辑框中,选中 “C++文件(.cpp)”,将 下方 “源.cpp” 手动改为要新创建的文件名,
如:helloWorld.c 。注意,默认 cpp 后缀名,要手动改为 .c 后缀名,然后点击 “添加”。
- 编写 helloworld.c程序。
- 点击上方绿色空心三角运行即可
1.2 代码逐行分析
- ‘#include' : 引⼊头⽂件专⽤关键字。
- <> : ⽤来包裹 库头⽂件名
- stdio.h : 使⽤的头⽂件。因为程序中使⽤了 printf() 函数。就必须使⽤该头⽂件。
std:标准:standard i: input 输⼊。 o: output 输出。
- int :main 函数返回值为整型。
- main: 整个程序的⼊⼝函数。 任何.c 程序,有且只有⼀个 main 函数。
- printf(); C语⾔向屏幕输出字符使⽤的函数。
- printf(“helloworld\n”)
printf();向屏幕输出一段内容helloworld: 待写出的字符串内容。\n: 回⻋换⾏。
- return 0;
return 返回。 C程序要求,main 函数要有返回值。借助 return 实现返回。0:成功!因为 int ,返回整数。
注意事项
- 程序中使⽤的所有的字符,全部是 “英⽂半⻆” 字符。
- 程序中,严格区分⼤⼩写。
- “;” 代表⼀⾏结束。不能使⽤ 中⽂ “;”,必须是英⽂。
1.3 代码执行流程分析
完成的C语言运行,分为以下4步,在VS中我们直接运行,其实是把中间的步骤给省略了

- 预处理(这一步后面单独讲解)
简单理解,就是先找到#include后面的 <stdio.h>这个文件
- 编译
把c文件编译成二进制文件后缀名为obj
- 连接/链接
把预处理找到的h文件,还有编译之后产生的obj文件打包在一起,产生exe文件
- 运行
运行exe文件
一、核心语法1:注释
1单行注释
- 语法:// 待注释的内容
- 位置:可放在代码后,称之为行尾注释; 也可放代码上一行,称作行上注释。
2 多行注释
- 语法:/* 待注释的内容 */
- 注意:多⾏注释内,可以嵌套单⾏注释。 多⾏注释之间不能嵌套。
3 示例
二、核心语法2:注释的小扩展
- 注释的快捷键:Ctrl + K,Ctrl + C/U
- 注释擦除:注释的内容,不参与运行
- 注释的嵌套:不管是单行还是多行,最好都不要嵌套
三、核心语法3:关键字
关键字:在C语言中被赋予了特定含义的英文单词,一共有32个关键字
但是不需要背,后面会挨个讲解,现在只要只有关键字的两个特点即可:
- 关键字全部小写
- 在特定的编译器中,关键字是高亮显示的
vs:蓝色或者紫色
vs:蓝色
现在知道两个关键字即可:
int:表示整数
return:表示程序结束了
四、核心语法4:常量
1 什么是常量
程序运行的过程中,其值永远不会发生改变的数据
2 常量的分类

3 练习
给你一组数据,说出下面每组数据中,分别是哪种类型的常量
4 细节补充
实型常量的小细节:
- 小数点前后,如果只有0,可以省略不写
- 科学计数法是实型常量,但是要写E
5 练习
- 选择题:
- 选择题:
- 选择题
- 选择题
6.6 输出常量
利用printf集合占位符的方式可以输出常量
格式:
printf(参数1,参数2);
参数1:输出内容的最终样式,以字符串的形式体现 (必填)
参数2:填补的内容 (选填)
占位符:
占位符 | 说明 |
整形 | %d |
实型 | %f |
字符 | %c |
字符串 | %s |
举例1:
输出一个整数
举例2:
输出一个小数
举例3:
输出一个字符
举例4:
输出一个字符串
举例3:
输出一段话
作业练习:
按照要求输出以下内容:
1,我学校的名字为:XXXXX
要求:学校的名字需要结合占位符的形式进行输出
2,我高考的总分为:XXX分
要求:总分需要结合占位符的形式进行输出
3,我亲亲女朋友的名字是:XXX
要求:女朋友的名字需要结合占位符的形式进行输出
6.7 输出多个常量
一个printf中可以同时输出多个数据,占位符和后面的数据要一一对应
练习:输出以下内容:
我亲亲女朋友的姓名是:小诗诗。性别:女。年龄:18岁。身高:1米82。体重:110斤。
要求:女朋友的姓名,性别,年龄,身高,体重等信息需要结合占位符的形式进行输出
6.8 输出并换行
操作系统 | 换行符 |
windows | \r\n(\r回到行首、\n到下一行)——>c优化后换行就\n就行了 |
mac | \r |
Linux | \n |
平时写代码的时候,想要换行直接写\n即可,C语言会根据不同的操作系统解析成对应的换行符
练习:输出以下内容
我亲亲女朋友的姓名是:小丹丹。性别:女。年龄:19岁。身高:1米63。体重:90斤。
要求1:女朋友的姓名,性别,年龄,身高,体重等信息需要结合占位符的形式进行输出
要求2:每一个数据单独成一行
五、变量
7.1 变量的三要素
- 变量名:用来在程序中使用。
- 变量类型:开辟内存空间大小。
- 变量值:存储的实际数据
7.2 变量定义:
类型名 变量名 = 变量值(一般都这么写)
举例:
int m = 57;
会开辟内存空间给变量。变量声明不会开辟内存空间。
代码演示:
变量的练习
- 两数相加
- 微信余额
用一个变量表示微信的余额需求:一开始微信的余额为100元,
收到了一个2元的红包
经常发生改变的数据,我们可以用变量来表示
7.3 变量的注意事项
- 只能存一个值
- 变量名不允许重复定义
- 一条语句可以定义多个变量
- 变量在使用之前一定要进行赋值
- 变量的作用域范围
六、数据类型
计算机的存储规则
在计算机中,任意数据的就是以二进制的形式来存储的
文本存储



图片存储
三要素:分辨率、像素、三原色(红、绿、蓝)———十进制(225,255,255)
声音存储


常见的进制
如何书写



如何转换


数据类型的作用
1.变量中能存储什么类型的数据
2.存储空间的大小

计算机中所有的数据都是以二进制的形式存在的,二进制每个0、1占一个bit,然而一个bit存储空间太小,所以在计算机中把 8个bit组成一组 叫 一个字节,是计算机最小的存储单元
sizeof 运算符
目标:会查看变量、类型占用内存大小
每种数据类型,都有自己固定的占用内存大小和取值范围。具体展开讲解前,我们先来看下,C 语言提供的查看变量或类型占用内存大小的运算符,sizeof。
- 语法 1:sizeof(变量名)
- 语法 2:sizeof(类型名)
数值型
可以分为有符号的、无符号的: signed-》有符号的—》正数、负数 unsigned—》无符号的—》只能是 正数,只能跟整数类型结合
整型
目标:选用不同类型存整数

基础信息
数据类型 | 字节数 | 格式符 | 数据范围 | 最小值宏 | 最大值宏 |
short(短整型) | 2 | %hd | -2<sup>15</sup> ~ 2<sup>15</sup>-1 (-32768 ~ 32767) | SHRT_MIN | SHRT_MAX |
int(整型) | 4 | %d | -2<sup>31</sup> ~ 2<sup>31</sup>-1 (-2147483648 ~ 2147483647) | INT_MIN | INT_MAX |
long(长整型) | 4 | %ld | -2<sup>31</sup> ~ 2<sup>31</sup>-1 (-2147483648 ~ 2147483647) | LONG_MIN | LONG_MAX |
long long(长长整型) | 8 | %lld | -2<sup>63</sup> ~ 2<sup>63</sup>-1 | LLONG_MIN | LLONG_MAX |
unsigned short(无符号 短整型) | 同 short | %hu | 0 ~ 2<sup>16</sup>-1 (0 ~ 65535) | 0 | USHRT_MAX |
unsigned int(无符号 整型) | 同 int | %u | 0 ~ 2<sup>32</sup>-1 (0 ~ 4294967295) | 0 | UINT_MAX |
unsigned long(无符号 长整型) | 同 long | %lu | 0 ~ 2<sup>32</sup>-1 (0 ~ 4294967295) | 0 | ULONG_MAX |
unsigned long long(无符号 长长整型) | 同 long long | %llu | 0 ~ 2<sup>64</sup>-1 | 0 | ULLONG_MAX |
上表中列出的占用字节数和取值范围,是大多数情况下各种类型的取值。
由于,C 标准没有具体规定以上各类数据所占用的字节数。因此,在不同系统、编译器下,数据类型占用的字节数会有所不同。
比如:int 类型,在 Turbo C 环境占 2 字节,取值范围与 short 相同。 而在 Visual C 环境下是 4 字节。再如:long 类型,相同的 gcc 编译器下,在 Windows 系统中占 4 字节,而在 Linux 系统中占 8 字节。
可以使用 sizeof 查看 数据类型 占用内存的大小。
可以引入头文件 #include <limits.h> 借助宏来查看 数据类型 在当前平台上 对应的最小、最大值。
验收案例
- 编写程序,选择合适的类型 定义变量 存储:人类年龄、中国人口数量 和 地球年龄(约45.5 亿), 并借助宏 打印 选用的类型对应无符号数 最大值,证明你的选择无误。
bool型
目标:知道 bool 类型两种取值
C语言在设计之初是没有布尔类型的,使用 1 和 0,对应表示真、假。
但,其他编程语言像 C++、java 都设计有布尔数类型。 C语言在1999 年推出的新标准(C99)中,也加入了 布尔类型。用 true 来代表 1,为真;用 false 来代表 0,为假。使用时,需要引入头文件 #include <stdbool.h>
虽然语法上与其他语言一致,但 C 语言每次在使用时需先引入头文件,较为麻烦。 因此,一些老 C 工程师还是喜欢直接在程序中用 1 和 0 来表示 真和假。
浮点型(实型)
目标:会选用浮点型变量存小数
实型表示有符号的十进制小数,在计算机内部以浮点方式表示(小数点是浮动的),因此也叫浮点型。
常见实型有两种: float (单精度)、 double (双精度)
实型数据没有八、十六进制,也没有 unsigned 无符号形式。在计算机底层采用的是近似计算,实现比较复杂,且不同平台处理方式不同。我们这里只学习它基本的知识。
基础信息
类型 | 字节数 | 格式符 | 有效数字 | 常量后缀 |
float (单精度) | 4 | %f | 6~7 | f |
double (双精度) | 8 | %lf | 15~16 | 无 |
long double(高精度) | 8 | %lf | 18·19 | L |
我们直接书写的小数常量,如 6.23,系统默认看做 double 类型。如想指明为 float 类型,需加后缀 f,6.23f。
- 6~7:
- 整数部分 + 小数部分 <= 6 位, 准确。
- 整数部分 + 小数部分 == 7 位,可能准确,也可能不准确。
- 整数部分 + 小数部分 > 7位。大多不准确。
- 15~16:
- 整数部分 + 小数部分 <= 15 位, 准确。
- 整数部分 + 小数部分 == 16 位,可能准确,也可能不准确
- 整数部分 + 小数部分 > 16位。大多不准确。
显示小数时,%f 和 %lf 默认保留 6 位小数。
如需指定小数位数,使用格式符 %.nf ,n 为几,表示精确到小数点后几位,会对 n+1 位做 4 舍 5 入。
验收案例
- 已知 圆周率π的值为3.14159265358979323846。选择一种浮点数类型定义变量保存π值,并打印输出变量,要求正确保留小数点后 8 位数据。
字符型
目标:会在程序中使用字符型数据
基础信息
C 语言定义 char 类型来表示字符数据。 其本质依然是存储数值,因此与数值型类似,也有有符号、无符号之分。占用 1 个字节内存大小。
类型 | 字节数 | 格式符 | 数据范围 | 最小值宏 | 最大值宏 |
char | 1 | %hhd | -2<sup>7</sup> ~ 2<sup>7</sup>-1 (-128 ~ 127) | CHAR_MIN | CHAR_MAX |
unsigned char | 1 | %hhu | 0~2<sup>8</sup>-1 (0 ~ 255) | 0 | UCHAR_MAX |
英文:1个字母、符号、数字占用一个字节
中文:在vs或者vc中,默认情况下、一个中文占用两个字节
字符串有个隐含的结束标记,占用一个字节
ASCII码
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 值了。
转义字符
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);是会报错的。这时,可以使用
\\"
将 “ 进行转义,还原其本身意。类似的还有:
\\'
代表 单引号。
\\\\
代表 反斜杠。
字符输入输出
C 语言提供了专门的函数,方便在程序中 获取、输出 字符数据。
- getchar():获取用户从键盘写入的一个字符。
- 程序执行到 getchar() 会暂停,等待用户键入字符数据。
- 一次 getchar() 调用,只读取一个字符。如用户键入多个字符,需要多次调用 getchar()读取。
- 函数调用完成,会返回实际读到的字符 对应的 ASCII 值。
- 用户键入字符结束,敲的回车键,对应‘\n’ 字符,也可以使用 getchar() 读取。
- putchar(ch):将 ch 对应的字符,输出到屏幕。
- ch 可以是变量也可以是常量。
- 一次 putchar() 调用,只写出一个字符(不含换行符 ‘\n’)。
- 函数调用完成,会返回实际写出的字符 对应的 ASCII 值。
验收案例
- 编写程序,使用 getchar接收用户输入的 字符 a 和回车符。要求通过 ‘a’ 进行数学运算得到 ‘A’,只使用一个 prinf 函数打印 ‘A’ 和 回车符的 ASCII 值,使用 tab 符隔分数据。
七、标识符
2.1 什么是标识符?
程序中,我们自己起的名字统称为标识符
2.2 标识符的硬性要求
- 以数字、字母、下划线组成
- 不能以数字开头
- 不能是关键字
- 区分大小写
2.3 标识符的软性建议
用英文单词,见名知意
变量名:全部小写
文件名:全部小写,单词之间用下划线隔开
八、scanf 输入
目标:接收用户输入数据
我们可以借助 getchar() 读取用键入的字符数据。 如果想要读取其他数据怎么办呢?C语言提供了 scanf() 函数,可以结合 格式符 读取各种类型数据。
基础信息
- 作用:从标准输入设备(键盘)上按格式获取数据。
- 语法:scanf("格式控制字符串“, ......); 需指定头文件 #include <stdio.h>
- 参 1: 必须是字符串,且必须包含 格式说明符(占位符)
- 格式符 与 数据类型中使用方式一致。 常用的有 %d、%c、%f、%lf 等。
- 后续参数(变参):个数,直接受 参 1 格式匹配符影响。
- 对应 格式符的 必须是 变量地址(&变量名,可取变量地址),代表数据存放位置。
- 示例:
注意事项
- 不要在 scanf 的参 1 中,添加类似 printf() 的提示字符串和 \n 换行符。
- 键入数据时,数据个数、类型、顺序,必须与参 1 中占位符一一对应。
- 键入数据时,数据间的分割符,必须与 参 1 中 占位符的分割符一致。
- scanf 的返回值,代表格式符成功匹配数据的次数。(较少使用)
- VS2019 以后的版本编译时,会将 scanf 划为 “不安全函数”,爆出C4996 错误,推荐你使用 s_scanf() 函数。
- *方法 1:**在项目中设置: 工程名→右键→属性→C/C++→预处理器→预处理器定义→编辑→将 _CRT_SECURE_NO_WARNINGS 加入“预处理定义” 中
- *方法 2:**在每个.c文件开头(第一行)添加宏:#define _CRT_SECURE_NO_WARNINGS
但,学习、练习、测试时,直接使用 scanf 很方便,可暂时屏蔽该错误。
九、运算符
1.算术运算符
运算符 | 术语 | 示例 | 结果 |
+ | 正号 | +3 | 3 |
- | 负号 | -3 | -3 |
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取余(取模 Modulo) | 10 % 3 | 1 |
注意事项
- 先 * / %,后 + -。
- 除法
- 两整数相除,结果整数(舍小数部分)
- 两浮点数相除,结果 double 浮点数
- 整数和实数相除,自动类型转换为实型
- 不允许 除 0(与数学一样)
- 取模(取余)
- 运算数必须是整型
- 对负数取余,结果为余数的绝对值
- 不允许 除 0(与数学一样)
4.小数直接参与计算,结果可能是不精确的
总结
算数运算符有哪些?
- 先 * / %,后 + -。
/ 运算注意什么?
- 两整数相除得整数。 运算表达式遵循类型转换规则
% 运算注意什么?
- 运算数必须是整数。 负数取余结果为正;获取余数的正负,跟第一个数字保持一致。

隐式转换
电脑在计算时,数据类型不一样不能直接运算,需要转成一样的,才能计算




强制转换

2. 比较运算符
基础语法
运算符 | 作用 | 示例 | 结果 |
< | 判断 小于 | 4 < 3 | 不成立(假):0 |
<= | 判断 小于或等于 | 4 <= 3 | 不成立(假):0 |
> | 判断 大于 | 4 > 3 | 成立(真):1 |
>= | 判断 大于或等于 | 4 >= 4 | 成立(真):1 |
== | 判断 相等 | 4 == 3 | 不成立(假):0 |
!= | 判断 不相等 | 4 != 3 | 成立(真):1 |
- *注意:**判断 “相等”,使用 “==”, 不能使用 “=”(赋值符)
优先级
- 整体,比算术运算符 低。
- 整体,比赋值运算符 高。
- \> >= < <= 高于 == !=
总结
- 关系运算的比较结果只有两种:1(成立、真)、0(不成立、假)
- 计算机中判等,需使用 “==”
- 优先级,高于赋值,低于算数。 \> >= < <= 高于 == !=
3. 赋值运算符
目标:会使用赋值运算符表达式**
包括:基本赋值运算符 和 复合赋值运算符( = 与算数运算符 组合而成)。
作用:给变量赋值。 结合性:自右向左。
基础语法
运算符 | 术语 | 示例 | 结果 |
+= | 加等于 | int a=1; a+=2;(等同于a = a+2) | a值为 3; |
-= | 减等于 | int a=5; a-=3;(等同于a = a-3) | a值为 2; |
*= | 乘等于 | int a=2; a*=2;(等同于a = a\*2) | a值为 4; |
/= | 除等于 | int a=4; a/=2;(等同于a = a/2) | a值为 2; |
%= | 模等于 | int a=3; a%=2;(等同于a = a%2) | a值为 1; |
- *注意:**赋值运算符,会修改变量的原始值。 赋值符左侧,必须可修改(变量)。
总结
- 先运算,后赋值。方向,自右向左
- += 可实现累加,将别人的数据累加给自己。
- 所有赋值运算符,都会修改变量原始值。
4. 自增减运算符
目标:实现数据的增 1、减1运算
自增自减运算也叫 增 1 减 1 运算,都是单目运算。
作用:
- 自增 ++, 放在变量前面或后面,对变量自身值+1。
- 自减 --, 放在变量前面或后面,对变量自身值-1。
- 方便实现变量的 +1 或 -1 运算。
应用场景:
- 点赞 和 取消点赞。
运算符 | 术语 | 示例 | 结果 |
++ | 自增 | int a=1; a++ 或 ++a;(等同于a = a+1) | a 值为 2; |
-- | 自减 | int b=5; b-- 或 --b;(等同于b = b-1) | b 值为 4; |
自增自减语法
++ 对变量值 +1。 -- 对变量值 -1。
前缀后缀区别
注意:++ 和 -- 如果 ==不是单独使用==(如:用在表达式中),前缀和后缀 ==差异巨大==
- 放在变量前,先 +1、-1 再取值使用。
- 放在变量后,先 取值用,再 +1、-1
代码验证:
注意事项
- 不能用于常量
- 不能用于表达式
- 优先级:整体高于算数运算符(必然高于比较、赋值);后缀高于前缀
- 不要在一个表达式中,对同一变量 多次 ++、-- 运算。可读性差,且不用编译系统结果不同。
总结
- ++ 自增 1, --自减 1
- 单独使用,前缀后缀没区别;
- 非单独使用:前缀,先+1、-1,再用; 后缀,先用,再+1、-1
- 只适用变量,不能用于常量、表达式。
- 优先级,高于算数、比较、赋值。后缀高于前缀。
5. 逻辑运算符
作用:
- 用程序解决 类似 或者、并且 这种 含有逻辑关系的 情况。
应用场景:
- 去京东买手机。 筛选条件: 128G 并且 120w 快充 。 后台 怎么做? 用 与 运算判断,满足展示,不满足不展示。如果用户 就想买 华为 或者 小米手机,后台用 或 运算,筛选厂商对应的手机。
基础语法
- 将多个条件放在一起运算,最终返回 真(1)或 假(0)
运算符 | 术语 | 示例 | 结果 | 速记 |
&& | 与 | 2>1 && 3>2 | &&两边同为真,结果为真,否则为假。 | 同真为真 |
|| | 或 | 2>1||3 > 5 | ||两边有一个为真,结果为真,二者同为假,结果为假。 | 有真为真 |
! | 非 | ! (2>1) | 取反!表达式为假,加 ! 为真;表达式为真,加 ! 为假。 | 真非为假 |
案例1 : 需求,手机存储大于 128,手机屏幕尺寸大于等于 6.35**
案例2 : 判断 20 是介于 30 和 10 之间的数。
短路运算
逻辑运算符的特性,导致实际应用中一部分表达式不执行,也能得出整个表达式结果。这一特点经常作为考点出现在计算机二级、期末考试题中。
在程序中:
- 判断 表达式 a && (b+c) 的结果:
- 当 a 为假时,不必计算 b+c,可直接得出表达式为假的结论。
- 判断 表达式 a || (b+c) 的结果:
- 当 a 为真时,则不必计算 b+c,就能判断出表达式的值为 真。
- *概念:逻辑表达式 运算过程中,只运算左边表达式,就能直接得出整个逻辑表达式的结果。—— 短路运算 **
短路运算作用
在代码中利用短路运算,可 避免不必要运算,提高程序执行效率。 比如有如下代码:
现要计算 c 值。= 右侧表达式含有逻辑或 || 运算符,运算特性 有真为真。|| 左边表达式很容易判断为 真,可确定整个表达式结果为 真。 右侧 b 相关的 复杂表达式 不需要计算 。
短路运算特性
左表达式能直接得逻辑表达式结果,右表达式不执行。
- *案例 1:**以下代码执行后,a、b、c 的值依次是多少?
简单分析代码。 很可能得出结论: a = 5,b = 3,c = 3
但,实际上这里的 b 并没有完成自增运算,值还是 2。 为什么 有前缀 ++ 自增,b 值还是 2 呢? 因为 短路运算!++b 并未执行。
逻辑 || 运算符,运算特性有真为真。 左侧 a = b+c 赋值表达式很容易得出结果为真。 因此 整个 表达式得出结论为真,右侧 ++b 并不需要执行。 因此,即使是 前缀自增,b 没有执行机会,值依然为 2。
正确输出结果:a = 5,b = 2,c = 3
- *案例 2:**分析代码,推测 a, x, y 的值分别是什么?
同样是逻辑运算表达式,逻辑与&& 运算符,运算特性 同真为真。 x 初值为 1,前缀 --x 执行 结果为 0,假。依然会触发短路运算特性。右侧 ++y 不执行。
因此,输出结果为:a=0, x=0, y=5
案例 3: 依然上述案例 2代码,将 --x 修改为 x--,输出结果为何?
修改后,x-- 由于是 后缀,因此 先取值 1 为真(而后再-1),所以没有触发 短路运算,继续运算 右侧 ++y,将 y 值自增为 6。 1 && 6 结果为真, a 值为 1。
因此,输出结果为:a=1, x=0, y=6
小知识:合理利用短路运算特性,提高程序执行效率
- 编写含**==&&==**表达式时,&& 同真为真,左表达式值为假时,右表达式不计算, 建议将 ==易假 值放左边==。
- 编写含**==||==**表达式时,|| 有真为真,左表达式值为真时,右表达式不计算。 建议将 ==易真 值放左边==。
总结
- &&:同真为真; ||:有真为真; ! :真非为假
- 判断一个数在另两个数范围内,用 && 实现
- 短路特性:运算符左侧表达式可直接得结论,则右侧表达式不执行
- 利用短路特性:&&,将易假表达式放左侧;||,将易真表达式放左侧
6. 条件运算符
基础语法
语法:表达式1 ?表达式 2:表达式 3
- 表达式 1 一定起 判别 作用。表达式 2 和 表达式 3 只能有一个执行。
- 三目运算的结果,必须被使用。
运算规则:
- 判断 表达式 1 的结果:
- 为真,整个三目运算的结果为 表达式 2
- 为假,整个三目运算的结果为 表达式 3
能解决什么问题呢?比如,查询成绩系统中,根据成绩判定是否及格?可以用 三目运算来进行判断。
案例 1:接收学生成绩,判断是否 及格,给出 Y/N 结果。**
案例 2:找出两个数中的较小值
特性和嵌套应用
嵌套条件运算符的写法,在实际编程中较少见,因为代码可读性低。 但,计算机考试中,经常出做考点。
辨别技巧是,当 表达式中 有 2 个以上问号、冒号,一定是发生了 三目运算嵌套。
处理方法是,先将位于右边的 “?” 与它后面最近一个 “:” 配对。因为,条件运算符的结合性,自右向左。
优先级,高于赋值运算符,低于算数、逻辑、比较运算符。
案例 1:
将 右侧的 ?与后面的 :配对,x < y ? x : y 看做一组 三目运算表达式,作为另外一组 三目运算的 表达式 3。
案例 2:
将 右侧的 ?与后面的 :配对,c > d ? e : f 看做一组 三目运算表达式,作为另外一组 三目运算的 表达式 2。
这种嵌套写法,看其他人写的程序时,能看懂即可。我们不要这样写。
总结
- 语法规则:
- 表达式1 ?表达式 2:表达式 3
- 表达式 1 为真,整个取表达式 2; 为假,整个取表达式 3
- 结果必须被使用
- 嵌套三目运算:
- 出现 两个以上 ?: ,说明有嵌套。
- 自右向左,找 “?” 与它后面最近一个 “:” 配对
- 优先级:
- 高于 赋值运算符,低于 算数、逻辑、比较运算符。
验收案例
练习1:分析程序,执行结束后 a、b、res 的值分别是多少?**
练习2:使用三目运算符,编写程序实现找出三个数中的最大值。**
7,逗号运算符
C语言中,逗号也是一种运算符。 用逗号将多个表达式连接起来,组成逗号表达式。一般形式为:
表达式 1,表达式 2,表达式 3,....,表达式 n
如:a+3, b+4, c+5 是一个 逗号表达式。
求解过程是 自左向右 依次求解。 整个逗号表达式的值,为最后一个表达式 n 的值。
逗号运算符的优先级,是所有运算符中最低的。
练习:分析下面代码执行过程。res 值为多少?
总结
取整个逗号表达式值的做法,在实际编程中不常用到。 但,计算机考试中,经常出做考点。记住两句话就好了:
- 整个逗号表达式的值,为最后一个表达式 的值。
- 逗号运算符优先级最低(比赋值还低)
练习
分析下列程序执行,i 值为多少?
8,运算符优先级
运算符 | 名称 |
[ ] | 数组下标 |
() | 圆括号 |
- | 负号 |
++、-- | 自增、自减<br />windows:先++优于后++ <br />mac、Linux从左到右依次计算 |
& | 取地址运算符 |
! | 逻辑非 |
(类型) | 强制类型转换 |
sizeof | 长度运算符 |
* | 乘 |
/ | 除 |
% | 取余 |
+ | 加 |
- | 减 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
&& | 逻辑与 |
|| | 逻辑或 |
? : | 条件运算符 |
= | 赋值运算符 |
/= | 除后赋值 |
*= | 乘后赋值 |
%= | 取余后赋值 |
+= | 加后赋值 |
-= | 减后赋值 |
逗号运算符 |
案例 1: 分析下面代码执行过程。res 值为多少?
案例 2: 分析下面代码执行过程。res 值为多少?
案例 3: 分析下面代码执行过程。res 值为多少?