Presentation is loading. Please wait.

Presentation is loading. Please wait.

第3章 数据类型、运算符与表达式.

Similar presentations


Presentation on theme: "第3章 数据类型、运算符与表达式."— Presentation transcript:

1 第3章 数据类型、运算符与表达式

2 本 章 内 容 C的数据类型 常量和变量 整型、实型、字符型数据 变量赋初值 各类数值型数据间的混合运算 算术运算符和算术表达式
赋值运算符和赋值表达式 逗号运算符和逗号表达式

3 3.1 C的数据类型 数据以特定的形式存在:如整数、实数、字符等。 数据结构:数据的组织形式 数据元素之间存在某些联系
线性(Linear)结构 层次结构或树(Tree)结构 网状或图(Graph)结构

4 3.1 C的数据类型 处理同一类问题,如果数据结构不同,算法也不同,应综合考虑,选择最佳的数据结构和算法。 基本类型 整型 字符型
实型单精度 枚举类型 实型双精度 构造类型 数组类型 结构体类型 共用体类型 指针类型 空类型 处理同一类问题,如果数据结构不同,算法也不同,应综合考虑,选择最佳的数据结构和算法。

5 3.2 常量和变量 常量和符号常量 常量 在程序运行过程中其值不能被改变的量。 如字面常量:如3.6, -8, 'A'等。
符号常量:用标识符代表的常量。 例3.1: #define PRICE 30 main() { int num, total; num = 10; total = num * PRICE; printf("total = %d", total); }

6 3.2 常量和变量 变量 运算过程中其值可以改变的量。 系统为程序中的每一个变量开辟一个存储单元,用来存放变量的值。如: X = 3.5
6.3 X

7 3.2 常量和变量 变量的命名 标识符:用来标识变量名、符号常量名、函数名、类型名、文件名的有效字符序列,不能与关键字同。
C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。 变量名实际上是一个符号地址。

8 3.2 常量和变量 变量的定义 C语言中要求变量要先定义,后使用。 变量的定义格式: 数据类型 变量名列表; 例如:int x, y;
数据类型 变量名列表; 例如:int x, y; int a; char c; 变量定义时要具体指出该变量要存放数值的类型,从而为该变量分配相应数据类型的内存单元空间。 变量定义时指定数据类型用来进行操作的匹配性检查。例如: int n; n = 5.5; printf("%d\n"); 输出结果:5 ?

9 3.3 整型数据 整型常量的表示方法 十进制整数 八进制整数:以数字0开头,如0123。任意一个八进制整数可表示为:
C = cn-18n-1 +cn-28n-2 +…+c181 + c080 Ci只能取0~7之一的值;八进制的基数是8。 十六进制整数:以0x开头,如0x123。 采用十六个不同的记数符号,即数码:0~9及A、B、C、D、E、F。 采用逢十六进一的进位原则,各位数的"权"是以16为底数的幂。 例如: (2AF)16 = 2×162+A×161+F×160 =2×162+10×16 +15×1 =(687)10

10 3.3 整型数据 整型变量 整型数据在内存中的存在形式 数据在内存中以二进制形式存放。例如: int i; i = 10;
数值是以补码形式表示的。 10 1

11 3.3 整型数据 整型变量的分类 根据数值的范围将变量定义为3种整型变量: 基本整型 int,-215~(215-1) 短整型
short [int], -215~(215-1) 长整型 long [int], -231~(231-1) 加上修饰符unsigned,有6种整型变量: [signed] int 有符号基本整型 unsigned [int] 无符号基本整型 [signed] short [int] 有符号短整型 unsigned short [int] 无符号短整型 [signed] long [int] 有符号长整型 unsigned long [int] 无符号长整型

12 3.3 整型数据 C标准没能具体规定以上各类数据所占内存字节数,由各计算机系统自动决定。 Turbo C整型类型的取值范围见表3.1。

13 3.3 整型数据 整型变量的定义 对变量的定义,一般在一个函数开头部分的声明部分定义。例如: main() { int a, b, c;
c = a+b; printf("%d", c); }

14 3.3 整型数据 整型数据的溢出 例3.3 main() { int a , b; a = 32767; b = a + 1;
printf("%d", b); } 分析结果?

15 3.3 整型数据 整型常量的类型 将一个整型常量赋值给某个整型变量时要做到类型匹配,注意以下几点: 不同的类型有不同的取值范围,例如:
int:-215~(215-1) long:-231~(231-1) int整数可赋值给int型和long int型变量。 long整数可赋值给long int型变量。 如果某一计算机系统的C版本确定short int与int型数据在内存中长度相同,二者可互相赋值。 一个整常量后加u或U表示unsigned int型。 一个整常量后加l或L表示long int型。 例如:678u、123l、432L

16 3.4 实型数据 实型常量的表示方法 十进制小数形式:必须有小数点 例如:12.65 .25 0.0
例如: 指数形式:字母e(E)之前必须有数字,且e后的指数必须为整数。 例如:15e3(15000),1.5e4 规范化指数形式 在字母e(E)之前的小数部分中,小数点左边有且只能有一个非零的数字。 例如: e2

17 3.4 实型数据 标准C未规定小数部分和指数部分所占bit数,而由各C编译系统自定。 实型变量 实型数据在内存中的存放形式 一般占4个字节。
系统把一个实型数据分成小数部分和指数部分分别存放。 例如: 1 + 数符 小数部分 指数 32bit 标准C未规定小数部分和指数部分所占bit数,而由各C编译系统自定。

18 3.4 实型数据 实型变量的分类(以Trubo C为例) 单精度型 float,32bit,6~7有效数字
双精度型 double,64bit,15~16有效数字 长双精度型 long double,128bit,18~19有效数字 实型数据的舍入误差 由于存储单元中有效数字的位数有限,故会产生误差。例3.4: main() { float a, b; a = e5; b = a + 20; printf("%f",b); } 分析输出结果?

19 3.4 实型数据 在运算中,尽量不要使两个相差很大的数值相加或相减。 例如: 0.001 + 1246825.0 – 1246820.0
= – = 5.0 而准确结果应为5.001。 如果: ( – ) = 5.001 在运算中,尽量不要使两个相差很大的数值相加或相减。

20 3.4 实型数据 实型常量的类型 C编译系统将实型常量作为双精度来处理。当在数后加f(F)时按单精度处理,从而可提高运算速度。
一个实型常量可以赋值给任意一个实型变量,根据其类型不同截取相应的有效数字。 例如: float a; a = ; printf("%f", a);

21 3.5 字符型数据 字符常量 用单引号引起来的单个字符。例如:'a', 'A'。 特殊的字符常量——转义字符
以一个"\"开头的字符序列,在屏幕上不能显示。 常用的以"\"开头的特殊字符见表3.3。 用ASCII表示一个字符 \ddd:1到3位8进制数所代表的字符 \xhh:1到2位16进制数的代表的字符 此方法可表示任何可输出的字母字符、专用字符、图形字符和控制字符。

22 3.5 字符型数据 字符变量 用来存放字符常量(只能存一个字符)。 字符变量的定义 char 字符变量列表 例如: char c1, c2;
char a; char b; char x; char y; 字符变量的赋值 c1 = 'a'; c2 = 'b'; x = c1; y = c2;

23 3.5 字符型数据 字符数据在内存中的存储形式及其使用方法 字符在内存中以其ASCII代码值存储。 'a' = 97 01100001
字符与整数的存储形式类似,可以以两种形式输出,也可进行算术运算。二者还可以互相赋值。 例3.6 main() { char c1, c2; c1 = 97; c2 = 98; printf("%c %c\n", c1, c2); printf("%d %d\n", c1, c2); }

24 3.5 字符型数据 例3.7 main() { char c1, c2; c1 = 'a'; c2 = 'b'; c1 = c1 – 32;
printf("%c %c", c1, c2); }

25 3.5 字符型数据 字符串常量 字符串是由一对双引号引起来的字符序列。 例如:"china","a"。
\0 字符常量和字符串常量的区别。 表示方法不同。 占用的存储空间不同。 不能把一个字符串常量赋值给一个字符变量。

26 3.6 变量赋初值 C语言允许在定义变量的同时给变量设置初值,称之为变量的初始化。例如: int x=5; int a, b, c=3;
float d=5.88, m=7.29; char c='r'; 变量的初始化不是以编译阶段完成,而是在程序运行时赋予初值。 例如: int a = 3; 相当于: int a; a = 3;

27 3.7 各类数值型数据间的混合运算 整型、实型、字符型数据间可以混合运算。 例如:
10 + 'a' – * 'b' 不同类型数据进行运算时,要先转换成同一类型,再进行运算。 转换规则(见p54图3.10) 高 double float long unsigned 低 int char, short 横向朝左的箭头表示必定的转换。 纵向箭头表示当运算对象为不同类型时转换的方向。低级类型转换为高级类型。 转换是由系统自动进行。

28 3.8 算术运算符和算术表达式 C的运算符 有13类,见p55。 算术运算符和算术表达式 基本的算术运算符:+、 –、 *、 /、 %
两个整数相除的结果为整数。 如果参加+, -, *, /运算的两个数中有一个数为实数,则结果为double型。 算术表达式和运算符的优先级和结合性 C算术表达式 用算术运算符和括号将操作数连接起来的、符合C语法规则的式子称为C算术表达式。 操作数:常量,变量,函数等。 表达式求值时按运算符的优先级别高低次序进行,优先级别相同时按规定的"自左至右"的结合方向处理。

29 3.8 算术运算符和算术表达式 强制类型转换运算符一般形式为: (类型) <表达式> 例3.8 main() {
(类型) <表达式> 例3.8 main() { float x = 3.6; int i; i = (int)x; printf("x=%f, i=%d", x, i); } 分析程序输出结果? 在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。 有两种类型转换 系统自动进行的类型换。 强制类型转换。

30 3.8 算术运算符和算术表达式 自增(++)、自减(--)运算符 使变量的值加一或减一。 前缀形式:++i, --i
例如: int i = 3, j, k; j = i++; k = ++i; printf("%d, %d, %d", i, j, k); 分析程序结果?

31 3.8 算术运算符和算术表达式 说明: ++和--运算符只能用于变量,不能用于常量或表达式。 分析:(a + b)++ ?
++和--的结合方向是"自右至左"。 例如:-x++ 相当于-(x++)

32 3.8 算术运算符和算术表达式 表达式使用中应注意的问题 ANSI C没能具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。
例1: a = f1() + f2(); 例2:int i = 3, j; j = (i++) + (i++) + (i++); 编程时应避免出现这种歧义性。 当多个运算符相连时,C编译系统尽可能多地自左至右将若干个字符组成一个运算符。 例3:a+++b 相当于 (a++) + b

33 3.8 算术运算符和算术表达式 在调用函数时,实参数的求值顺序,C标准无统一规定。 例4: int i = 3;
printf("%d, %d", i, i++); 结果1:3, 3 结果2:4, 3 改进: int i = 3; j = i ++; printf("%d, %d", i, j);

34 3.9 赋值运算符和赋值表达式 char int long float double long double 1 2 4 8 16
"=":将其右边表达式的值赋给左边的变量。 例如: int x; x = 2.34; 类型转换 Trubo C不同类型数据的长度(B): char int long float double long double 1 2 4 8 16

35 3.9 赋值运算符和赋值表达式 实型数据赋给整型变量:舍弃小数部分。 整型数据赋给实型变量:数值不变,以浮点型存储。
double型数据赋值给float变量,截取其前面7位有效数字,注意数值范围不能溢出。 字符型数据赋给整型变量:只占低八位,符号扩展。 整型数据赋给字符型变量:截取低8位。 带符号整型(int)赋给长整型变量:进行符号扩展。而将long型数据赋值给int型变量时,截取低16位。 无符号整型(unsigned int)赋给长整型变量:高位补0。 将非unsigned型数据赋给长度相同的unsigned型变量,原样照赋。 不同类型的整型数据间的赋值归根到底即:按存储单元中的存储形式直接传送。

36 3.9 赋值运算符和赋值表达式 复合的赋值运算符 赋值号"="之前加上一个算术运算符(逻辑运算符,位运算符)称为复合运算符。如+=,-=,*=,/=,%=。 例如: x+=5 等价于 x=x+5 x*=y+8 等价于 x=x*(y+8) 凡是双目运算符,都可与赋值符一起组合成复合赋值符。 C语言规定了10种复合赋值运算符。(P62)

37 3.9 赋值运算符和赋值表达式 赋值表达式 由赋值运算符将变量和表达式连接起来的式子,称为赋值表达式。 一般形式
<变量名> <赋值运算符> <表达式> 右边的表达式又可以是一个赋值表达式。 如:a=(b=5) 赋值运算符按照"自右至左"的结合顺序赋值。 如上式等价于:a=b=5 又如:a=(b=4)+(c=6) 表达式的值为10,a值为10,b为4,c为6。 赋值表达式不仅可以现出在赋值语句中,还可以出现在其他语句(如输出语句、循环语句等)中。 如:printf("%d", a=b);

38 3.10 逗号运算符和逗号表达式 逗号运算符 ",",又称顺序求值运算符。 逗号表达式
用逗号将两个表达式连接起来,得到的表达式称为逗号表达式。 逗号表达式的一般形式: 表达式1,表达式2 逗号表达式的求解过程: 先求表达式1的值,再求表达式2的值。整个表达式的值是表达式2的值。 例1: a=3*5, a*4 ("="的优先级别高与",") 例2: (a=3*5, a*4), a+5 (逗号表达式的值为20)

39 逗号表达式的一般扩展形式 表达式1,表达式2,表达时3, … 表达式n 它的值为表达式n的值。 说明: 逗号运算符是所有运算符中级别最低的。 并不是任何地方现出的逗号都是作为逗号运算符。 如:printf("%d,%f ", a, b); 逗号表达式最常用于循环语句中。

40 作 业 P66-68 3.5 3.8 3.9 3.10 3.12


Download ppt "第3章 数据类型、运算符与表达式."

Similar presentations


Ads by Google