当前课程知识点:数据结构 > 第0章 预备知识 > 0.1变量、类型和表达式 > 0.1变量、类型和表达式
同学们,大家好
我是云南大学信息学院的教师孔兵。
在开始教材内容之前
我们增加一章预备知识
就叫第0章吧,我们一起从零开始
走向程序设计的星辰大海
这一章节的主要目标是
解决后续课程中会遇到的
C语言程序设计中语法方面的问题
帮助同学们读懂程序
首先讨论变量和类型
在程序设计语言中我们都学过变量
一般来说,我们通过声明变量存储程序中要处理的数据
变量都有数据类型
变量必须在声明以后才能引用
比如我们声明两个整型变量a和b
后面可以用它们来存放2个整型数
在此,我们要强调的是
变量的本质是内存中的一块存储空间
数据类型呢,它的本质是对存储空间大小的一个约定
我们在图中直观地看一下
假设底板是内存空间,所谓声明整型变量a
它的含义是要求分配一块长度为4个字节的存储空间
用来存放一个整数,图中是从120这个地址开始的4个字节
为了使用方便,把这块空间和一个名字对应起来
这样呢,我们就可以通过这个名字来引用这个变量
但是,一定要记住变量的本质就是那块存储空间
这一点对我们后面理解指针
理解结构体的操作非常重要
数据类型的本质是对存储空间大小的一个约定
当我们在进行该类型变量声明的时候
也就是说要求分配这样大小的一块存储空间
声明一个整型变量,就是要求分配4个字节的存储空间
这里顺便说一句
因为计算机本身的内存地址表述起来比较麻烦
我们在课程当中,就用一个整数来表示计算机内存当中的一个地址
下面我们来看和数据类型有关的一个内容
C语言可以使用 typedef 关键字
为一个已经定义的数据类型
另外起一个名字
在教材当中,有三种使用的情况
第1种是给一个基本类型另起一个名字
比如说int
通过typedef int integer这样的定义方式
给这个基本数据类型起了另外一个类型名叫integer
有了这样的定义后,integer和int的作用完全一样了
可以用它来声明整型变量
第2行中,用typedef给int起了另外一个名字,status
同样的道理,status实际上也是整型
在后面教材中大家会看到
很多函数的返回值类型是status
这里想强调的是
现在虽然return返回的是一个整型数
但是这个整型数有一定含义
返回的整型数表示这个函数执行的一个状态
一般是1,表示函数执行顺利
0,表示函数执行过程中发生了问题
第2种情况是我们构造的一个结构体类型
它包含三个成员name ,number,score
使用typedef给这个构造类型另外起了个类型名叫student
有了这样类型名以后
就可以用它声明变量
比如说student stu1,stu2
这就是两个上述定义的结构体的变量
后面的这个st前面带了一个*
st也是一个类型名,什么样的类型呢
这里通过typedef
我们定义了一个指向上述结构体的指针类型的名字
就是说它是一个指针类型的名字
是一个类型名,通过st这个类型名我们也可以声明变量
比如说p和q
声明以后
p和q就是两个指向上述定义结构体的两个指针
第3种情况,如果不看typedef,只看后半部分
我们知道这是在定义一个包含20个整型数的数组
count是数组名
但是前面加上typedef以后呢
count不再是一个数组
它变成了一个数组类型的名字
是一个类型名
现在如果我们用count来声明变量
比如说a和b的话。那么这里的a,b是什么呢
这里的a、b都是包含20个整型数的数组
最后,提醒一下
typedef 只是为已有或者说
已定义数据类型取了一个新类型名
它本身不能定义新的数据类型
好了,同学们
我们现在已经讲解完变量和类型的相关内容
下面呢我们讨论一下运算符和表达式
在程序设计语言中,表达式是操作符
操作数和标点符号组成的一个序列
这样的一个序列呢说明了一个计算的过程
这个计算过程最终的结果是能得到一个值
能得到一个值是表达式最重要的一个特征
在C语言中有两类表达式
一类称为算术表达式,它的特点是运算结果是一个数值
比如说我们用算术运算符乘、除、加、减和求余等
加上操作数,遵循一定的运算规则
我们就可以计算得到一个数值
这类运算呢是我们比较熟悉的
c语言中还有一个自加和自减运算
就是连续的两个加号或者两个减号
我们以自加为例,运算符出现的位置不同
又可以把自加分为前加和后加
那么我们要注意它们之间的区别
例如,i++和++i
如果i++或是++i单独成为一个语句的话
这时前加和后加实际上没有任何的区别
但是当他们出现在一个表达式中的话
那么二者的区别就有了
例如,初始i=5,下面的两个赋值语句
x=i++;和x=++i就不同了
赋值语句等号右边是一个表达式
要计算一个值
如果是后加的话是说先把本身的值
作用到表达式的运算当中去,然后再做自加
这一次自加对本次计算没有什么影响
所以x赋值i++,x的值是5;如果是前加的话
是先做自加
然后再把加的结果作用到表达式的运算中去
那么这次自加就会对本次表达式的计算结果产生影响了
所以x赋值++i时,x的值呢就是6
另一类表达式称为关系表示式
这类表达式涉及的运算符可以分为两种
关系运算符和逻辑运算符
其中关系运算符有6个
大于、大于等于、小于
小于等于、等于、不等于
关系运算符都是2目运算符
有左右操作数
提醒大家的是
关系运算符两边只要是可比较的数据类型的变量和值
那么都可以作为左右操作数
但是,不是什么类型的数都能进行比较
逻辑运算符有3个,和,或,非
前两个是2目运算符
左右操作数要求必须是逻辑值
也就是1或者0
对于和来说,如果左右操作数都是1
则结果是1,其它情况结果是0
对或来说,左右操作数都是0
则结果是0,其它情况呢都为1
最后一个非是单目运算,只有右操作数
1非以后是0,0非以后是1
用关系和逻辑运算符我们可以组合成关系表达式
它也有表达式的特点
就是说它最终计算的结果一定是一个值
只是在这里,它会是一个逻辑值
也就是1或者0
我们用这个值来控制程序的流向
如在条件和循环语句中
还有一个运算呢要提一下
就是求字节运算sizeof
它只有一个参数
这个参数一般是一个类型的名字
计算的结果是以字节表示的该类型的存储空间大小
前面说过的
类型不外乎是约定了一个存储空间的大小
这里就是给出这个大小
我们在动态申请空间的时候会用到这个运算
好了,同学们
我们今天的课程就到这里
下节课再见
-1.算法概念导入
-2.数据结构课程介绍
-0.1变量、类型和表达式
-0.2 函数
--0.2 函数
-0.3 指针和单链表
-0.4 数组、指向函数的指针
-1.1什么是数据结构
--测试题
-1.2基本概念和术语
--测试题
-1.3数据结构的描述
--测试题
-1.4抽象数据类型的定义和实现
--测试题
-1.5算法和算法分析概念
--测试题
-1.6算法分析示例
--测试题
-2.1 线性表的类型定义
--测试题
-2.2线性表的顺序表示和实现
--测试题
-2.3 线性链表
--2.3 线性链表
--测试题
-2.4 静态链表
--2.4 静态链表
--测试题
-2.5 循环链表和双向链表
--测试题
-3.1 栈
--3.1栈
--测试题
-3.2 栈的实现
--3.2 栈的实现
--测试题
-3.3 栈的应用
--3.3 栈的应用
-3.4 栈与递归的实现
--测试题
-3.5 队列和链队列
--测试题
-3.6 循环队列
--3.6 循环队列
--测试题
-4.1 串
--4.1 串
--测试题
-5.1 数组定义和表示
--测试题
-5.2矩阵的压缩存储
--测试题
-6.1 树的定义和基本术语
-6.2 二叉树和二叉树的性质
--测试题
-6.3 二叉树的存储结构
--测试题
-6.4 遍历二叉树
--测试题
-6.5 线索二叉树
--测试题
-6.6 树的存储
--6.6树的存储
-6.7 树的转换和遍历
--测试题
-6.8 赫夫曼树
--6.8 赫夫曼树
-6.9 赫夫曼编码
--测试题
-7.1 图的定义和术语
--测试题
-7.2 图的存储结构
--测试题
-7.3 图的遍历
--测试题
-7.4 最小生成树
--测试题
-7.5 有向无环图
--测试题
-7.6 最短路径
--测试题
-8.1 查找基本概念和顺序查找
--测试题
-8.2 有序表的查找
--测试题
-8.3 二叉排序树
--测试题
-8.4 平衡二叉树
--测试题
-8.5 哈希表
--测试题
-9.1插入排序
--测试题
-9.2 希尔排序
--9.2 希尔排序
--测试题
-9.3 快速排序
--9.3 快速排序
--测试题
-9.4 选择排序
--9.4 选择排序
--测试题
-9.5 堆排序
--9.5 堆排序
--测试题
-9.6 归并排序
--9.6 归并排序
--测试题
-9.7 基数排序
--9.7 基数排序
--测试题
-9.8 排序方法总结