type
status
date
slug
summary
tags
category
icon
password
一、C语言的简介
什么是C语言
C语言之父
C语言的由来
C语言的发展
为什么要学C语言/能做什么
为什么要学习这套C语言
本套课程适用人群
课程内容介绍

1、C语言标准

1.1 标准简史

  1. 1972年C语⾔在⻉尔实验室诞⽣. 丹尼斯·⾥奇 参考B语⾔开发.
  1. 1970-80年代,C语⾔被⼴泛应⽤,产⽣很多不同的C语⾔版本. 程序可移植性⽐较差.
  1. 1983年,美国国家标准委员会(ANSI) 成⽴⼀个⼩组来制定C语⾔的标准. C语⾔⽀持哪些语法、⽀持哪些功能 等等.
  1. 1989年,通过了C语⾔的第⼀个标准. C89标准.
  1. 1990年,国际标准化组织(ISO) 和 国际电⼯委员会(IEC) 将 C89标准当做国际的C语⾔标准. C90标准. C89和 C90指的是同⼀个标准
  1. 1994年 ISO和 IEC 对 C89标准进⾏修订. C94标准. 由于并没有增加新的语法特性,还是叫做 C89或者C90.
  1. 1995年 ISO和IEC再次做了修正,C95 标准.
  1. 1999年 ISO 和 IEC 发布了C语⾔新标准. C语⾔第⼆个标准. 在该标准中,新增许多实⽤的C语⾔语法特性. 增 加新的关键字、可变⻓数组等等. C99标准
  1. 2007年,重新修订了C语⾔.
  1. 2011年, 发布新的版本。新增了⼀些语法,泛型、国际化⽀持. ⽬前为⽌最新版本是 C11.

1.2 标准的影响

  1. 可将C语⾔的标准理解为C语⾔说明书。但其并没有强制性约束⼒。
如:微软拿到标准,认为有些标准不合理,不⽀持。
微软认为某些特性⾮常好,但标准中没有,微软可以修改标准,新增语法.
  1. 如果编译器不⽀持标准,我们即使使⽤标准中的语法仍然会报错。
  1. 编译器版本也会影响程序。因此,编写程序之前要确定编译器版本。

1.3 常见的C/C++编译器:

  1. Borland C++ 宝蓝公司
  1. Intel C++ 英特尔编译器
  1. VC++ 微软公司
  1. 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 环境搭建:

  1. 打开微软的官方网站 https://visualstudio.microsoft.com/,下载 Visual Studio 安装包。
  1. 双击安装包进行安装
      • *操作一:**在 “工作负荷” 标签页中,选择 “使用 C++的桌面开发” 选项即可。
操作二:“安装位置” 中修改安装路径。
路径的要求:
​ 1,不要有中文,不要有空格,不要有一些特殊符号
​ 2,选择一个统一的文件夹进行管理
  1. 自动下载并安装,过程略微漫长,耐心等待。
  1. 安装完成,弹出 “安装完毕” 对话框。 点击确定。
  1. 接下来,VS希望你使用微软的账号登录,没有可以注册一个。也可以点击“暂时跳过此项”。
  1. 根据提示选择一个自己喜欢的主题
  1. 点击启动,到此整个环境全部搭建完毕

1.2 第一个代码HelloWorld

  1. 创建项目
    1. 点击 “创建新项目”,创建一个项目。
  1. 选择创建 “控制台应用”,点击下一步。
  1. 指定项目名称。确保位置下的项目存储目录存在。 勾选 “将解决方案和项目.....” ,点击 “创建”。
  1. 右侧的解决方案管理器可以按照自己的习惯是放在左侧或者右侧
    1. 默认是右侧,可以拖到左侧来,每个人的习惯不同,没有固定标准
  1. 创建 helloworld.c ⽂件
    1. 右键选择原文件,选择添加,选择新建项
  1. 在弹出的编辑框中,选中 “C++文件(.cpp)”,将 下方 “源.cpp” 手动改为要新创建的文件名,
    1. 如:helloWorld.c 。注意,默认 cpp 后缀名,要手动改为 .c 后缀名,然后点击 “添加”。
  1. 编写 helloworld.c程序。
  1. 点击上方绿色空心三角运行即可

1.2 代码逐行分析

  1. ‘#include' : 引⼊头⽂件专⽤关键字。
  1. <> : ⽤来包裹 库头⽂件名
  1. stdio.h : 使⽤的头⽂件。因为程序中使⽤了 printf() 函数。就必须使⽤该头⽂件。
std:标准:standard i: input 输⼊。 o: output 输出。
  1. int :main 函数返回值为整型。
  1. main: 整个程序的⼊⼝函数。 任何.c 程序,有且只有⼀个 main 函数。
  1. printf(); C语⾔向屏幕输出字符使⽤的函数。
  1. printf(“helloworld\n”)
    1. printf();向屏幕输出一段内容
      helloworld: 待写出的字符串内容。
      \n: 回⻋换⾏。
  1. return 0;
    1. return 返回。 C程序要求,main 函数要有返回值。借助 return 实现返回。
      0:成功!因为 int ,返回整数。
注意事项
  • 程序中使⽤的所有的字符,全部是 “英⽂半⻆” 字符。
  • 程序中,严格区分⼤⼩写。
  • “;” 代表⼀⾏结束。不能使⽤ 中⽂ “;”,必须是英⽂。

1.3 代码执行流程分析

完成的C语言运行,分为以下4步,在VS中我们直接运行,其实是把中间的步骤给省略了
notion image
  • 预处理(这一步后面单独讲解)
    • 简单理解,就是先找到#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 常量的分类

notion image

3 练习

​ 给你一组数据,说出下面每组数据中,分别是哪种类型的常量

4 细节补充

实型常量的小细节:
  • 小数点前后,如果只有0,可以省略不写
  • 科学计数法是实型常量,但是要写E

5 练习

  1. 选择题:
  1. 选择题:
  1. 选择题
  1. 选择题

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 变量的三要素

  1. 变量名:用来在程序中使用。
  1. 变量类型:开辟内存空间大小
  1. 变量值:存储的实际数据

7.2 变量定义:

​ 类型名 变量名 = 变量值(一般都这么写)
​ 举例:
​ int m = 57;
会开辟内存空间给变量。变量声明不会开辟内存空间。
代码演示:
变量的练习
  1. 两数相加
  1. 微信余额
    1. 用一个变量表示微信的余额需求:一开始微信的余额为100元,
      收到了一个2元的红包
      经常发生改变的数据,我们可以用变量来表示

7.3 变量的注意事项

  • 只能存一个值
  • 变量名不允许重复定义
  • 一条语句可以定义多个变量
  • 变量在使用之前一定要进行赋值
  • 变量的作用域范围

六、数据类型

计算机的存储规则

在计算机中,任意数据的就是以二进制的形式来存储的

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

常见的进制

如何书写
notion image
notion image
notion image
如何转换
notion image
notion image
 

数据类型的作用

1.变量中能存储什么类型的数据
2.存储空间的大小
notion image
计算机中所有的数据都是以二进制的形式存在的,二进制每个0、1占一个bit,然而一个bit存储空间太小,所以在计算机中把 8个bit组成一组 叫 一个字节,是计算机最小的存储单元

sizeof 运算符

目标:会查看变量、类型占用内存大小
​ 每种数据类型,都有自己固定的占用内存大小和取值范围。具体展开讲解前,我们先来看下,C 语言提供的查看变量或类型占用内存大小的运算符,sizeof。
  • 语法 1:sizeof(变量名)
    • 语法 2:sizeof(类型名)

      数值型

      可以分为有符号的、无符号的: signed-》有符号的—》正数、负数 unsigned—》无符号的—》只能是 正数,只能跟整数类型结合

      整型

      目标:选用不同类型存整数
      notion image

      基础信息

      数据类型
      字节数
      格式符
      数据范围
      最小值宏
      最大值宏
      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():获取用户从键盘写入的一个字符。
          1. 程序执行到 getchar() 会暂停,等待用户键入字符数据。
          1. 一次 getchar() 调用,只读取一个字符。如用户键入多个字符,需要多次调用 getchar()读取。
          1. 函数调用完成,会返回实际读到的字符 对应的 ASCII 值。
          1. 用户键入字符结束,敲的回车键,对应‘\n’ 字符,也可以使用 getchar() 读取。
      • putchar(ch):将 ch 对应的字符,输出到屏幕。
          1. ch 可以是变量也可以是常量。
          1. 一次 putchar() 调用,只写出一个字符(不含换行符 ‘\n’)。
          1. 函数调用完成,会返回实际写出的字符 对应的 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 格式匹配符影响。
          • 对应 格式符的 必须是 变量地址(&变量名,可取变量地址),代表数据存放位置。
      • 示例:

        注意事项

        1. 不要在 scanf 的参 1 中,添加类似 printf() 的提示字符串和 \n 换行符。
        1. 键入数据时,数据个数、类型、顺序,必须与参 1 中占位符一一对应。
        1. 键入数据时,数据间的分割符,必须与 参 1 中 占位符的分割符一致。
        1. scanf 的返回值,代表格式符成功匹配数据的次数。(较少使用)
        1. VS2019 以后的版本编译时,会将 scanf 划为 “不安全函数”,爆出C4996 错误,推荐你使用 s_scanf() 函数。
          1. 但,学习、练习、测试时,直接使用 scanf 很方便,可暂时屏蔽该错误。
            • *方法 1:**在项目中设置: 工程名→右键→属性→C/C++→预处理器→预处理器定义→编辑→将 _CRT_SECURE_NO_WARNINGS 加入“预处理定义” 中
            • *方法 2:**在每个.c文件开头(第一行)添加宏:#define _CRT_SECURE_NO_WARNINGS

        九、运算符

        1.算术运算符

        运算符
        术语
        示例
        结果
        +
        正号
        +3
        3
        -
        负号
        -3
        -3
        +
        10 + 5
        15
        -
        10 - 5
        5
        *
        10 * 5
        50
        /
        10 / 5
        2
        %
        取余(取模 Modulo)
        10 % 3
        1

        注意事项

        1. 先 * / %,后 + -。
        1. 除法
            • 两整数相除,结果整数(舍小数部分)
            • 两浮点数相除,结果 double 浮点数
            • 整数和实数相除,自动类型转换为实型
            • 不允许 除 0(与数学一样)
        1. 取模(取余)
            • 运算数必须是整型
            • 对负数取余,结果为余数的绝对值
            • 不允许 除 0(与数学一样)
        4.小数直接参与计算,结果可能是不精确的

        总结

        算数运算符有哪些?
        • 先 * / %,后 + -。
        / 运算注意什么?
        • 两整数相除得整数。 运算表达式遵循类型转换规则
        % 运算注意什么?
        • 运算数必须是整数。 负数取余结果为正;获取余数的正负,跟第一个数字保持一致。
        notion image

        隐式转换

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

        强制转换

        notion image

        2. 比较运算符

        基础语法

        运算符
        作用
        示例
        结果
        <
        判断 小于
        4 < 3
        不成立(假):0
        <=
        判断 小于等于
        4 <= 3
        不成立(假):0
        >
        判断 大于
        4 > 3
        成立(真):1
        >=
        判断 大于等于
        4 >= 4
        成立(真):1
        ==
        判断 相等
        4 == 3
        不成立(假):0
        !=
        判断 不相等
        4 != 3
        成立(真):1
        • *注意:**判断 “相等”,使用 “==”, 不能使用 “=”(赋值符)

        优先级

        1. 整体,比算术运算符 低。
        1. 整体,比赋值运算符 高。
        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
            • 单独使用,前缀后缀没区别;
            • 非单独使用:前缀,先+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 值为多少?