Presentation is loading. Please wait.

Presentation is loading. Please wait.

没有规矩,不成方圆。.

Similar presentations


Presentation on theme: "没有规矩,不成方圆。."— Presentation transcript:

1 没有规矩,不成方圆。

2 第3章 数据类型、运算符与表达式 3.1 C的数据类型 3.2 常量与变量 3.3 整型数据 3.4 实型数据

3 3.5 字符型数据 3.6 变量赋初值 3.7 各类数值型数据间的混合运算 3.8 算术运算符和算术表达式 3.9 赋值运算符和赋值表达式 3.10 逗号运算符和逗号表达式

4 本章大纲 数据类型、运算符与表达式(7学时) 教学内容: C的数据类型:基本数据类型;自定义的数据类型
常量和变量:符号常量与一般常量;变量的定义和赋值 各类型数据的混合运算 运算符与表达式:算术运算符;关系运算符与逻辑运算符;表达式的执行顺序

5 基本要求: 了解C语言的数据类型; 了解常量的概念、常量的分类; 了解整型、实型和字符型数据的存储形式;
掌握变量的概念、变量的分类及变量的初始化方法; 掌握各类数值型数据间的混合运算规则; 掌握常见的各种运算符及表达式; 理解运算符的优先级与结合性。 重点:基本数据类型;变量定义和赋值;运算符与表达式 难点:自定义的数据类型;运算符优先级。

6 3.1 C的数据类型 数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作。
基本类型:整型,字符型,浮点型(单精度型,双精度型),枚举类型; 构造类型:数组类型,结构体类型,共用体类型,指针类型,空类型。 数据类型决定: 1.数据占内存字节数 2.数据取值范围 3.可对数据进行的操作

7 补充了解 数据结构 数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。数据结构不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。 数据结构是指同一数据元素类中各数据元素之间存在的关系。数据结构分别为逻辑结构、存储结构(物理结构)和数据的运算。数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构。数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。 常用数据结构 :数组、线性表、链表、队列、栈、树、图等的定义、存储和操作

8 (1)不同的计算机语言所允许定义和使用的数据结构是不同的。
(2)处理同一类问题,如果数据结构不同,算法也会不同。

9 在程序运行过程中,其值不能被改变的量称为常量。
3.2 常量与变量 例如 : 12,0,-3为整型常量; 、-1.23为实型常量; ‘a’,‘d’为字符常量。 常量和符号常量 常量: 在程序运行过程中,其值不能被改变的量称为常量。 字面常量或直接常量 符号常量:以用一个标识符代表一个常量 #define PRICE 30

10 × 例3.1符号常量的使用。 #define PRICE 30 main ( ) { int num, total; num=10;
1.习惯上,符号常量名用大写 2.程序中不能再次对符号常量赋值。 例3.1符号常量的使用。 #define PRICE 30 main ( ) { int num, total; num=10; total=num * PRICE; printf("total=%d",total); } #define PRICE 30 main ( ) { …… PRICE=40; } × total=300

11 这么麻烦给常量起了名字,有什么好处吗? (1)含义清楚。定义符号常量名时应考虑“见名知意”。
(2) 在需要改变一个常量时能做到“一改全改”。 #define PRICE 30 一看就知道PRICE表示价格,但千万不要在定义圆周率的时候也这样写,虽然不错,但达不到“见名知意”的目的了。 #define PRICE

12 变量是指在程序运行期间,其值可以改变的量。
变量 变量是指在程序运行期间,其值可以改变的量。 1.用来存放数据 2.对应内存中的一个特定的存储单元 3.有名字,以便被引用 1.怎么对应到特定的存储单元呢? 由编译系统完成。 (参阅《编译原理》) 2.变量的名字要怎么起呢?

13 ? 3 变量怎么对应到特定的存储单元呢? 为了便于引用存储单元而起的名字。 类似于人名 a
变量名 a 3 变量值 存储单元的内容 2004H 存储单元地址 存储单元 存储单元地址一般用十六进制数表示 ,与变量名一一对应,类似于身份证号,唯一但难记,类似于身份证号。 每个存储单元都由一个唯一的存储单元地址和存储在单元里面的内容组成

14 Class和CLASS,Class,cLass
都不同! 标识符(identifier):用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符。 合法的标识符名: while, _total,student_name,lotus_1_2_3,Class,class ,BASIC 标识符的命名规则: (1)只能由字母、数字和下划线三种字符组成, (2)且第一个字符必须为字母或下划线。 必须同时满足以上两个条件。 不合法的标识符名:   M.d.John,¥123,3d64,a>b ×

15 不合法的变量名:3num,day‘,while
“先定义,后使用” 变量的名字要怎么起呢? (1)符合标识符的2个命名规则; (2)不能和关键字(32个)重名。 必须同时满足以上两个条件。 强制类型定义 我是君子,先说了才会用啊! 合法的变量名:num,day,x1 不合法的变量名:3num,day‘,while ×

16 还记得进制间如何转换吗?忘了的赶快找找啊!
3.3 整型数据 整型常量的表示方法 如123表示十进制数123 以0开头的数是八进制数。如0123表示八进制数123, -011表示八进制数-11 整型常量即整常数。 (1) 十进制整数。 (2) 八进制整数。 (3) 十六进制整数。 单片机程序设计中经常用到 以0x开头的数是十六进制数。如0x123,代表十六进制数123 -0x12等于十进制数-18

17 3.3.2 整型变量 1.整型数据在内存中的存放形式 例子: 10=(1010)2 数据在内存中是以二进制形式存放的。
整型变量 1.整型数据在内存中的存放形式 每一个整型数据(包含变量和常量)在内存中占2个或4个字节。 例子: 10=(1010)2 (a)存放的示意图 (b)实际存放图

18 掌握 补码(complement) 在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 负数补码的求法: (1)写出该数的绝对值的二进制形式; (2)按位取反; (3)再加1。 一个正数的补码和其原码的形式相同。 原码又是什么呢?

19 了解 补充内容:原码(true form) 原码是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数,其余位表示数值的大小。 ②整数原码的定义 [X]原=X (0≤X <2n) =2n-X(-2n<X≤0)例如:[+1011]原=   [-1011]原= ①小数原码的定义 [X] = X (0≤X<1)  =1-X (-1<X≤0 ) 例如: X= , [X]原=    X=- , [X]原=   

20 2. 整型变量的分类 (1) 基本整型(int) 修饰符: (1)有符号(signed) (2) 短整型(short int)
2. 整型变量的分类 有符号基本整型 [signed] int 无符号基本整型 unsigned int 修饰符: (1)有符号(signed) (2)无符号(unsigned) (1) 基本整型(int) (2) 短整型(short int) (3) 长整型(long int) 有符号短整型 [signed] short [int] 无符号短整型 unsigned short [int] 有符号长整型 [signed] long [int] 无符号长整型 unsigned long [int] [ ]里的关键字可以省略!

21 如果内存中有个数据是这样存储的,那么它是多少?
例子 如果是无符号数,它是65535 如果是有符号数,它是-1

22 对变量的定义,一般是放在一个函数的开头部分的声明部分(也可以放在函数中某一分程序内,但作用域只限它所在的分程序)。
C规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义” 3. 整型变量的定义 int a,b; unsigned short c,d; long e,f; 对变量的定义,一般是放在一个函数的开头部分的声明部分(也可以放在函数中某一分程序内,但作用域只限它所在的分程序)。

23 例3.2整型变量的定义与使用。 main() {int a,b,c,d; /*指定a、b、c、d为整型变量*/ unsigned u; /*指定u为无符号整型变量*/ a=12;b=-24;u=10; c=a+u;d=b+u; printf("a+u=%d,b+u=%d\n",c,d); }

24 (a=12) + (u=10) ----------------- (c=22)

25 求b=-24的补码 ----------------- ( b=-24的补码) + (u=10) (d的补码) (d的绝对值=14) a+u=22,b+u=-14

26 在Turbo c中一个int型变量的最大允许值为32767,如果再加1,会出现什么情况?
4. 整型数据的溢出 main() { int a,b; a=32767; b=a+1; printf("%d,%d",a,b); } 不等于32768吗? 32767,-32768

27 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (a=32767) + 1 -----------------
既然是这样,那要怎么改才能得到预期的结果32768呢?想一想啦! (a=32767) ----------------- (负数)? (b的绝对值,即32768 ) 真值为

28 整型常量的类型 (1) 一个整数,如果其值在-32768~+32767范围内,认为它是int型,它可以赋值给int型和long int型变量。 (2) 一个整数,如果其值超过了上述范围,而在 ~ 范围内,则认为它是长整型,可以将它赋值给一个long int型变量。 (3)一个整常量后面加一个字母u,认为是unsigned int型,如12345u,在内存中按unsigned int规定的方式存放。如果写成-12345u,则先将-12345转换成其补码53191,然后按无符号数存储。 (5) 在一个整常量后面加一个字母l或l,则认为是long int型常量。例如123l、432l、0l等。

29 3.4 浮点型数据 浮点型常量的表示方法 浮点数(floating-point number)即实数(real number)。 指数形式 十进制小数形式。它由数字和小数点组成 123e3,123E3 .123,123., 123.0, 0.0 注意:字母e(或E)之前必须有数字,且e后面的指数必须为整数 e3 2.1e3.5., e ×

30 知道了! 可以表示为 e0, e1、 e2、 e3、 e4、 e5…… 无数种?…… 原来 e2是规范化的指数形式。 “规范化的指数形式”: 即在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。一个实数在用指数形式输出时,是按规范化的指数形式输出的。

31 一个浮点型数据在内存中占4个或8个字节(32位或64位)
了解 浮点型变量 1.浮点型数据在内存中的存放形式 按照指数形式存储的 一个浮点型数据在内存中占4个或8个字节(32位或64位) 小数位数越多,精度越高 指数位数越多,表示的数的范围越大。 采用规范化的指数形式 纯小数部分 图3.7 实数 在内存中的存放形式示意

32 2.浮点型变量的分类 C浮点型变量分为三类: 单精度(float) 双精度(double) 长双精度型(long double)
float x,y; 2.浮点型变量的分类 C浮点型变量分为三类: 单精度(float) 双精度(double) 长双精度型(long double) 占4个字节(32位) double z; 占8个字节(64位) long double t; 占16个字节(128位)

33 main() {float a,b; a = 123456,789e5; b = a + 20 ; printf("%f",b); }
3.浮点型数据的舍入误差 浮点型用有限的存储单元存储,所以提供的有效数字也就有限,故会产生舍入误差。 main()  {float a,b;   a = ,789e5;  b = a + 20 ;  printf("%f",b);   } 应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。

34 3.4.3 浮点型常量的类型 * f = 2.45678 * 4523.65 单精度 双精度 双精度
浮点型常量的类型 提高精度 运算速度降低 f = * 取前7位 * 单精度 双精度 双精度 难道不能就按单精度计算吗? f = f* F

35 3.5 字符型数据 不同! 2.以一个“\”开头的字符序列。是 “控制字符”,在屏幕上是不能显示的 3.5.1 字符常量
3.5 字符型数据 2.以一个“\”开头的字符序列。是 “控制字符”,在屏幕上是不能显示的 字符常量 1.用单引号(即撇号)括起来的一个字符。 如‘a’,‘x’,‘D’,‘?’,‘$’ 。 如‘\n’,‘\t’,‘\b’,‘\r’,‘\\’, ‘\’’, ‘\’’’, ‘\ddd’, ‘\xhh’ ‘a’和‘A’相同吗? 不同!

36 例3.5转义字符的使用。 main() {printf(" ab c\t de\rf\tg\n"); printf("h\ti\b\bj k"); } 打印机 fab c gde h jik 白纸黑字 f gde h j k 屏幕 空说无凭

37 3.5.2 字符变量 1.字符型变量用来存放字符常量 2.只能放一个字符 3.一个字符变量在内存中占一个字节 字符变量的定义:
字符变量 字符变量的定义: char c1,c2; 1.字符型变量用来存放字符常量 2.只能放一个字符 3.一个字符变量在内存中占一个字节 字符变量的定义和赋值: char c1=‘a’,c2='b'; 字符变量的赋值: c1='a';c2='b';

38 3.5.3 字符数据在内存中的存储形式及其使用方法 存储 输出 将该字符的相应的ASCII代码放到存储单元中 1.以字符形式输出
字符数据在内存中的存储形式及其使用方法 将该字符的相应的ASCII代码放到存储单元中 存储 1.以字符形式输出 2.以整数形式输出 输出 示意图 实际存储情况

39 ※ ※ 通用 例3.6 向字符变量赋以整数。 a b 97 98 main() %c表示以字符形式输出。
{ char c1,c2; c1=97; c2=98; printf("%c %c\n",c1,c2);/*以字符形式输出*/ printf("%d %d\n",c1,c2);/*转换为整数形式输出*/ %c表示以字符形式输出。 %d表示以带符号的十进制整数形式输出。 通用 a b 97 98

40 A B 例3.7 大小写字母的转换。 main() {char c1,c2; c1='a'; c2='b'; c1=c1-32;
掌握 例3.7 大小写字母的转换。 main() {char c1,c2; c1='a'; c2='b'; c1=c1-32; c2=c2-32; printf("%c %c",c1,c2); A B

41 如: “CHINA”, ”a”,“how do you do.”,”123.45”
字符串常量 字符串常量是一对双引号括起来的字符序列。 “a” ‘a’ ? × = “a”是字符串常量 ‘a’是字符常量 a \0 a

42 √ × × char c; c=“CHINA" c="a"; 考考你 下面3个赋值语句中哪些是对的?为什么?
2.必须使用字符数组,数组中每一个元素存放一个字符。   

43 ? × 3.6 变量赋初值 1.允许在定义变量的同时使变量初始化 3.同种类型的可以合并定义 2.部分赋初值
3.6 变量赋初值 1.允许在定义变量的同时使变量初始化 2.部分赋初值 3.同种类型的可以合并定义 int a=3,b=3,c=3; int a,b,c=5; int a=3;   float f=3.56;  char c='a'; int a=b=c=3; ×

44 3.7 各类数值型数据间的混合运算 转换规则 纵向的箭头表示数据转换的方向 横向向左的箭头表示必定的转换 图3.10

45 10 + ‘a’ + i * f - d / e 107 + i * f - d / e 107 + 6.0 - d / e
假设i是int变量,值为3,f是float变量,值为2.0,d是double变量,值为4.0,e为long型,值为8 优先级相同 ‘a’ i * f d / e ①算10+‘a’:把‘a’转换成int为97,再加10,等于107 *优先级高于+,- i * f d / e ②算i*f:把i和f都转换成double,然后相乘得6.0 +和-优先级相同 d / e ③算 :把107转换成double,和为113.0 /优先级高于- d / e ④算d/e:把e转换成double,商为0.5 ⑤把113.0 转换成double,差为112.5

46 3.8 算术运算符和算术表达式 1.算术运算符 (+ - * / %) 2.关系运算符 (> < >= <= = = !=)
3.8 算术运算符和算术表达式 1.算术运算符 (+ - * / %) 2.关系运算符 (> < >= <= = = !=) 3.逻辑运算符 (! && ||) 4.位运算符 (<< >> ~ & ∧ |) 5.赋值运算符 (=及其扩展赋值运算符) 6.条件运算符 (? :) 7.逗号运算符 (,) 8.指针运算符 (*和&) 9.求字节数运算符 (s i z e o f) 10.强制类型转换运算符 ( (类型) ) 11.分量运算符 (. ->) 12.下标运算符 ([ ]) 13.其他 (如函数调用运算符())

47 3.8.2 算术运算符和算术表达式 1. 基本的算术运算符 *不能写成× 如3+5、+3 +:加法运算符 或正值运算符 如5-2、-3
算术运算符和算术表达式 1. 基本的算术运算符 如3+5、+3 +:加法运算符 或正值运算符 -:减法运算符 或负值运算符 *:乘法运算符 /:除法运算符 %:模运算符 或求余运算符 如5-2、-3 如3*5 *不能写成× 如5/3=1, 5/3的结果可能是-1,也可能是-2 大部分是“向零取整” %两侧均应为整型数据 如7%4的值为3

48 2.如果在一个运算对象两侧的运算符的优先级别相同,则按规定的“结合方向”处理。
 2.算术表达式和运算符的优先级与结合性 优先级: 1.先按运算符的优先级别高低次序执行 2.如果在一个运算对象两侧的运算符的优先级别相同,则按规定的“结合方向”处理。 运算对象 运算符 常量 变量 函数 + - * / 结合性: 1.左结合性:即运算对象先与左面的运算符结合 2.右结合性:有些运算符的结合方向为“自右至左”. 算术表达式 用算术运算符和括号将运算对象(也称操作数)连接起来的、符合c语法规则的式子.例如:a*b/c-1.5+'a'

49 3.强制类型转换运算符 两种类型转换 若x为float型,则 “x%3”不合法,必须用:“(int)x%3” 如3+6.5 自动类型转换

50 先将x与y相加,然后将他们的和转换成整型
表达式应该用括号括起来 一般形式: (类型名)(表达式) (int)(x+y) 先将x与y相加,然后将他们的和转换成整型 (int)x+y 只将x转换成整型,然后与y相加 原来是这样!

51 在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化
例3.8强制类型转换。 main() {float x; int i; x=3.6; i=(int)x; printf("x=%f,i=%d“,x,i); } 在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化 x= , i=3

52 4.自增、自减运算符 自增(减)运算符常用于: ++ 1.循环语句中,使循环变量自动加1或减1。 2.指针变量,使指针指向下一个地址。 --
++i 先使i的值加1,然后再使用i 自增(减)运算符常用于: 1.循环语句中,使循环变量自动加1或减1。 2.指针变量,使指针指向下一个地址。 自增运算符 ++ i++ 先使用i,然后再使i的值加1 --i 先使i的值减1,然后再使用i 自减运算符 -- i-- 先使用i,然后再使i的值减1

53 不合法 i=3; printf("%d",++i); i=3; printf("%d", i ++); i=3; j=++i;
5++ (a+b)++ i=3; printf("%d",++i); 不合法 4 i=3; printf("%d", i ++); 自增运算符(++)和自减运算符(--),只能用于变量,而不能用于常量或表达式, ++和--的优先级:第2级。 ++和--的结合方向是“自右至左”。 3 i=3; j=++i; printf("%d",j); 4 i=3; j= i++; printf(“%d”,j); 3

54 3.9 赋值运算符和赋值表达式 赋值运算符就是“=” 作用是执行一次赋值操作 优先级:第14级 结合性:右结合性 如a=3 a=3+c
3.9 赋值运算符和赋值表达式 1.赋值运算符 赋值运算符就是“=” 作用是执行一次赋值操作 优先级:第14级 结合性:右结合性 如a=3 a=3+c

55 2.类型转换的赋值规则 实质:按存储单元中的存储形式直接传送。 数值不变,以浮点数形式存储到变量中 单精度 整 型 舍弃实数的小数部分
整 型 舍弃实数的小数部分 数值不变有效值位数扩展到16位 截取前7位有效数字 字符的8位放到整型变量的低8位 将低8位放到字符变量中,(截断) 高8位补零 符号扩展 无符号 有符号 双精度 字 符 型

56 int i; i=3.56; printf(" i= %d",i); i=3 main() {unsigned a; int b=-1;
例 把浮点型传送给整型变量。 int i; i=3.56; printf(" i= %d",i); i=3 例3.9有符号数据传送给无符号变量。  main() {unsigned a; int b=-1; a=b; printf("%u",a); 65535

57 C语言规定可以使用10种复合赋值运算符。即: +=,-=,*=,/=,%=,<<=,>>=,&=,∧=,|=
3. 复合的赋值运算符 C语言规定可以使用10种复合赋值运算符。即: +=,-=,*=,/=,%=,<<=,>>=,&=,∧=,|= 例如: a+= 等价于 a=a+3 x*=y 等价于 x=x*(y+3) x%= 等价于 x=x%3 ① x %= y+3 ② x %= (y+3) ③ x = x %(y+3) (不要错写成x=x%y+3)

58 赋值表达式:由赋值运算符将一个变量和一个表达式连接起来的式子 。
a=b=c=5 a=5+(c=6) a=(b=4)+(c=6)  4. 赋值表达式 赋值表达式:由赋值运算符将一个变量和一个表达式连接起来的式子 。 a=(b=10)/(c=2) printf(“%d”,a=b); 一般形式为: <变量><赋值运算符><表达式> 如果a的初值是12,a+=a-=a*a 运算后a的值是多少? 求解的过程是:将赋值运算符右侧的“表达式”的值赋给左侧的变量。

59 3.10 逗号运算符和逗号表达式 如: 3+5,6+8 (a=3*5,a*4),a+5 1.逗号运算符,又称为“顺序求值运算符”
3.10 逗号运算符和逗号表达式 如:    3+5,6+8 1.逗号运算符,又称为“顺序求值运算符” 2.逗号运算符是所有运算符中级别最低的 3.用来将两个表达式连接起来 ① x=(a=3,6*3) ② x=a=3,6*a x值是多少?表达式值是多少? 逗号表达式的一般形式:表达式1,表达式2 逗号表达式的扩展形式: 表达式1,表达式2,表达式3……表达式n (a=3*5,a*4),a+5 运算后a的值是多少?表达式的值是多少? 求解的过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。

60 注意:并不是任何地方出现的逗号都是作为逗号运算符。 例如:
printf("%d,%d,%d",a,b,c);  printf("%d,%d,%d",(a,b,c),b,c); 逗号运算符

61 一分耕耘,一分收获!


Download ppt "没有规矩,不成方圆。."

Similar presentations


Ads by Google