Presentation is loading. Please wait.

Presentation is loading. Please wait.

C语言程序设计 第三章 数据类型、运算符与表达式

Similar presentations


Presentation on theme: "C语言程序设计 第三章 数据类型、运算符与表达式"— Presentation transcript:

1 C语言程序设计 第三章 数据类型、运算符与表达式

2 主要内容 3.1 C语言的数据类型 3.2 常量与变量 3.3 整型数据 3.4 浮点型数据 3.5 字符型数据 3.6 变量赋初值
3.7 各类数值型数据间的混合运算 3.8 算术运算符和算术表达式 3.9 赋值运算符和赋值表达式 3.10 逗号运算符和逗号表达式 3.11 关系运算符 3.12 逻辑运算符

3 3.1 数据及数据类型 C语言共有10种数据类型:

4 3.2 常量与变量 常量和符号常量 整型常量即整数。 十进制数:以非0开始的数。如:220、-560、+369
八进制数:以0开始的数。如:06、0106、0677 十六进制数:以0X或0x开始的数,如:0X0D、0XFF、0x4e、0x123等。 长整型数:在整型常数后添加一个“L”或“l”字母表示。如:22L、0773L、0Xae4l等。

5 3.2 常量与变量 浮点型常量即实数 一般形式:由数字、小数点以及必要时的正负号组成。如:29.56、-56.33、0.056、.056、0.0等。 指数形式:相当于科学计数法,将a×10b的数表示如下: aEb 或 aeb 其中:a、E(或e)、b任何一部分都不允许省略。如:2.956E3、-0.789e8、.792e-6等。错误表示: e-6、2.365E。

6 3.2 常量与变量 字符常量:用两个英文单引号限定的一个字符。如:‘a’ 、‘9’ 、 ‘Z’ 、‘%’。 特殊字符常量:转义字符
字符形式 功能 \n 换行,将当前位置移到下一行开头 \t 水平跳格,跳到下一个Tab位置 \b 退格,将当前位置移到前一列 \r 回车,将当前位置移到本行开头 \\ 反斜杠字符“\” \' 单引号字符' \" 双引号字符" \ddd 进制数表示的对应ASCII码字符 \xhh 进制数表示的对应ASCII码字符

7 3.2 常量与变量 字符串常量:用英文双引号限定的一个字符序列,这个字符序列包括的字符个数称为字符串的长度,其长度允许为0。如:
"Hello world" 长度为11 “ "   长度为1 "0.912e8" 长度为7 定义符号常量的一般格式: #define 符号常量名 常量 例如: #define MAX 200 该命令定义了符号常量MAX,它表示常数200。

8 3.2 常量与变量 字符串 “program”在内存存储的形式如下图所示。
该字符串占用8个字节的存储空间,但其有效字符的个数却是7,最后一个字节存储字符串结束标志“\0”。 p r o g a m /0 字符串存储形式

9 3.2 常量与变量 例:已知圆的半径r=16.7,编写程序计算圆的周长和面积。 #define PI 3.14159 void main()
{ float r=16.7; float l,s; l=2*PI*r; s=PI*r*r; printf("L=%f S=%f\n",l,s); }

10 3.2 常量与变量 常量的本质 不占据任何存储空间 属于指令的一部分,编译后不再更改

11 3.2 常量与变量 变量 变量名:用标识符标识变量名。 标识符:用来标明变量名、函数名、数组名、结构体名、文件名、类型名等的符识。
标识符命名规定:标识符由字母(区分大小写)、下划线、数字三种字符组成,且第一个字符必须是字母或者下划线。见教材P5,表1-2,C语言的31个保留字。 变量的赋值:变量赋值的一般格式 变量名=表达式 例如: y=x+6.9; 必须注意:“=”并非指两侧相等,而是包含了计算和赋值两个过程。首先计算表达式的值;然后将计算的结果保存到“=”左侧的变量中。

12 3.3 整型变量 整型变量 整型变量的分类 基本型 int:占2个字节,取值范围为215~2151。
短整型 short int:所占字节和取值范围均与基本型相同 长整型 long int 整型变量,分为有符号型和无符号型。具体有6种数据类型: signed int: 有符号普通整型,简写为int, unsigned int:无符号普通整型:取值范围是0~65535 signed short int :有符号短整型,简写short unsigned short int:无符号短整型,简写为unsigned short signed long int:有符号长整型 unsigned long int :无符号长整型数,简写为unsigned long。

13 变量的数据类型、字节长度、位数、数据范围
3.3 整型变量 变量的数据类型、字节长度、位数、数据范围 符号 字节 位数 数据类型标识符 数据范围 1 8 char -128~ ~27-1 2 16 short [int] -32768~ ~215-1 3 int 4 32 long [int] -231~231-1 unsigned char 0~ ~28-1 unsigned short [int] 0~ ~216-1 unsigned int unsigned long [int] 0~ ~232-1 float 10-38~1038 64 double 10-308~10308

14 3.3 整型变量 整型变量的定义:一般格式:整型变量类型符 变量名表;如: int a, b,c; unsigned long d;
例2 整型变量应用举例。 void main() { int num1, num2 ,result; num1=-1; num2=4; result =(num1+ num2)*10; printf(“%d\n”, result ); }

15 3.4 浮点型数据 浮点型变量(也叫实型变量) 浮点型变量的分类 :按照存储数值的精度,浮点型变量分为单精度浮点型、双精度浮点型和更高精度浮点型三类,分别用float、double和long double 说明。通常float型用4个字节存储, double型用8个字节存储,long double型用16个字节存储。 浮点型变量的定义:一般格式: 浮点型变量类型符 变量名表; 如:float a,f=12.98;     double b;

16 3.4 浮点型数据 小数形式 小数形式由数码0~ 9和小数点组成。当某浮点数整数部分或小数部分为0时,0可以省略,但小数点不可省略。 例如:
0.0,.25,5.789,0.13,5.0,300., ,123.等均为合法的实数。 345(无小数点),a7.(数码不可以是字母)等均为非法的浮点数。

17 3.4 浮点型数据 指数形式 指数形式由尾数加阶码标志e或E以及阶码(只能为整数,可以带符号)组成。
其一般形式为a En(a为尾数,n为阶码)其值为 a×10n 例如,2.1×105可以表示为2.1E5,3.7×10-2可以表示为3.7E2

18 3.4 浮点型数据 例3 浮点型变量的应用。 void main() { float r,s; r=2.769; s=3.1416*r*r;
printf(“s=%f\n”,s); }

19 3.5 字符型变量 字符型变量 字符型变量:每个字符型变量只能存储一个字符,占一个字节,它实际存储的是8比特的ASCII编码。例如,当一个变量存储字符‘A’时,实际上是存储‘A’的 ASCII 值65。 字符型变量分类:分为两类:有符号字符型变量和无符号字符型变量,分别用signed char和unsigned char说明。通常只用char来说明字符型变量,它相当于说明符signed char, 即它将转换成有符号的整型数,数值范围是-128~127,而unsigned char型变量的数值范围是0~255。 字符型变量的定义:一般格式: 字符型变量类型符 变量名表; 如: char ch; unsigned char less;  

20 3.5 字符型变量 例4 字符型变量应用举例。 void main() {
char ch1='A'; /* 定义字符型变量ch1并赋初值'A' */ char ch2; /* 定义字符型变量ch2 */ ch2=ch1+5; /* 用表达式为ch2赋值 */ printf(“%c,%c\n”,ch1,ch2); /* 以字符格式输出ch1、ch2的值 */

21 3.5 字符型变量 例5 字符型变量与整数的关系举例。 void main() { char ch; /* 定义字符型变量 */
int i; /* 定义整型变量 */ ch='A'; ch=ch+32; i=ch; /* 用字符型变量为整型变量i赋值 */ printf("%d is %c\n",ch,i); printf("%c is %d\n",ch,ch); }

22 3.5 字符型变量 例6 有符号字符型变量和无符号字符型变量的比较。 void main() { char c;
unsigned char d; /* 定义无符号字符型变量 */ c='\376'; d='\376'; printf("%d,%d\n",c,d); }

23 3.5 字符型变量 其它类型变量 指针变量(第六章); 数组变量(第四章); 结构体变量(第八章); 联合体变量(第八章);

24 3.6 变量赋初值 什么是对变量赋初值? C语言允许在定义同时赋初始值。变量赋初值就是在定义变量的同时,给变量赋一个值。这个变量产生后第一次被赋值,所以叫赋初值。 如何进行赋初值? 对变量赋初值只要在定义的时候用赋值运算符赋给该变量一个值就行。 如:int a=3; float x=5.56; char c1=’a’;

25 3.6 变量赋初值 在赋初值过程中的问题 int x,y,z=3;
此时只有z=3,而x,y没有初值,其初值也不是0,而是一个不确定的值,这个值在该变量所能表示的数值范围内,具体是多少我们不知道。如果此时使用该变量,系统不会检查、提示,而直接使用其中那个不确定的值,会出错的。 如:int a,b,c=5; 相当于如下两个语句: int a,b,c; c=5;

26 3.6 变量赋初值 int a=b=c=3;这种写法是不正确的。不能表示a、b、c的初值都是3。 可写成: int a=3,b=3,c=3;
或者写成: int a,b,c; a=b=c=3; 注意:初始化不是在编译阶段完成的,而是在运行时赋予初值的。

27 3.6 变量赋初值 变量数据的存储与读取 变量所代表的数据是存储在(计算机)内存中。在使用中往往希望数据的存储应灵活、多样,以便于编程。
变量数据的存储:变量数据的存储形式有: 静态存储 static 静态型 extern 外部型 动态存储 auto 自动型 register 寄存器型 这部分的内容在第五章函数中详细介绍。

28 3.6 变量赋初值 变量数据的读取 直接读取:变量名实际代表一个确 定的存储单元。程序编译完成后, 变量就与数据存储单元一一对应。
变量 内存 a b 变量数据的读取 直接读取:变量名实际代表一个确 定的存储单元。程序编译完成后, 变量就与数据存储单元一一对应。 对变量读取操作,就是到对应的存 储单元中读取数据。 间接读取: (指针)变量中存放的 是数据内存的地址,在这种情况下, 首先拿存放数据的地址,然后,再 到对应的地址中读取数据。 变量 地址 内 存 a b

29 3.7 各类数值型数据间的混合运算 为什么各类型的数据可以进行混合运算
字符型数据在内存中是按数值方式存放的。而整型数据和实型数据肯定也是按数值方式存放的。在这种前提下,这三种类型的数据实际上是可以进行混合运算的。但是应该有一个运算原则。 如何在各类型的数据之间进行混合运算 首先转换成同一类型,然后运算。 转换规则是低级别的数据向高级别数据转换。

30 3.7 各类数值型数据间的混合运算

31 3.7 各类数值型数据间的混合运算 例如:计算:3+‘1’+0.1/3-5.3/3L 解:转换
3+31 (字符3的ASCII值)+0.1(d)/3.0(d)-5.3(d)/3.0(d) 所有的类型转换过程由系统自动进行。

32 3.8 算术运算符和算术表达式 算术运算符 C语言提供了5个基本的算术运算符:  加法运算符 - 减法运算符,负号运算符 * 乘法运算符
 加法运算符 - 减法运算符,负号运算符 * 乘法运算符 / 除法运算符 % 取余运算符或称模运算符 运算符,的优先级相同,*,/,%的优先级相同,*,/,%的优先级高于和运算符,算术运算符都是左结合的运算符。

33 3.8 算术运算符和算术表达式 注意: 使用“/”时注意:如果运算符两边的数据为整型,那么得到的结果也必是整型,5/2=2,1/5=0,而不是0.2,1.0/5=0.2。 如果其中一数是负数,舍入的值不固定,得到的值也不固定。如:-5/3可以得到-1和-2两值,TC2.0采取“向零取整”法得到-1。 使用“%”时注意:该运算符的两边只能是整型数据。且得到的结果也只可能落在从0到%右边的数减1这个范围内。如:7%4的数值为3。

34 3.8 算术运算符和算术表达式 算术表达式定义 用算术运算符号和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为算术表达式。其中:运算对象包括常量、变量、函数等。 例如:3+4.5*a-b*4/3 a*b/c-1.5+’a’

35 3.8 算术运算符和算术表达式 优先级 C语言规定,对表达式求值时,按运算符的优先级别高低,从高到低进行运算。另外,C语言中还规定了运算符的结合性,算术运算符的结合方向是“从左至右”。不是所有的运算符的结合性都是从左至右有,有的是从右至左的,称右结合性。 在书中附录3中P365中表明。

36 3.8 算术运算符和算术表达式 强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成所需类型。例如: (float)x
  (int) x+y (int) (x+y)   (float) (5%3) 其格式为: (类型)(表达式)

37 3.8 算术运算符和算术表达式 注意:在强制类型转换时,要产生的是上个临时数据,这个临时数据的类型是指定的类型,而原始数据的类型不会发生改变。 main( ) { float x; int y; x=3.6; y=(int) x; printf(“%f,%d”,x,y); } 运行结果为: , 3

38 3.8 算术运算符和算术表达式 在C语言中有两种形式的类型转换: 一种是系统自动进行的类型转换,如5*0.6;
另一种是强制类型转换,象(int)x%8。 在上面这个例子中%运算符要求两个运算数都为整型,如果有一个运算数不是整型,那么系统将报错。这种情况下,如果变量x不是整型,那么必须使用强制类型转换。

39 3.8 算术运算符和算术表达式 自增、自减运算符(++、--) ++是自增运算符。++k或k++都是让变量k的值加1。
++K含义:先执行K=K+1,再使用K值。 K++含义:先使用K值后,再执行K=K+1。

40 3.8 算术运算符和算术表达式 例如: k=1; k=1; j=++k; j=k++;
总之,自增、自减运算符都有两种用法: 前置运算:运算符放在变量之前,如:++变量、--变量先使变量的值增(或减)1,然后再以变化后的值参与其它运算,即先增减、后运算。 后置运算:运算符放在变量之后。如:如变量++、变量--变量先参与其它运算,然后再使变量的值增(或减)1,即先运算、后增减。

41 3.8 算术运算符和算术表达式 自增、自减运算符使用中的问题说明 这两种运算符只能用于变量,而不能用于常量或表达式。
++、-- 运算符的优先相同,比算术运算符优先级要高。其结合性是“从右至左”的。-i++ 相当于 -(i++)。 例:i=3; k=3;   j=-i++; j1=+(++k); printf(“%d”,j); 结果是:-3 printf(“%d”,j1); 结果是:4      

42 3.8 算术运算符和算术表达式 要避免发生歧义性 main() { int x=6, y;
printf("x=%d\n",x); /*输出x的初值*/ y = ++x; /*前置运算*/ printf("y=++x:x=%d,y=%d\n",x,y); y = x--; /*后置运算*/ printf("y=x--: x=%d,y=%d\n",x,y); } 运行结果:x=6      y=++x: x=7,y=7      y=x--: x=6,y=7

43 3.8 算术运算符和算术表达式 注意程序的写法 i=3; printf(“%d,%d”,i,i++); 结果为:3 ,3 (有的系统左至右)
4 ,3 (多数系统右至左) 最好写成: i= 3 ; j =i++; printf(“%d,%d”,j,i);  结果为:3,4

44 3.8 算术运算符和算术表达式 如果i的初值为3 (i++)+(i++)+(i++) 有的系统:3+4+5 = 12
有的系统:3+3+3 = 9 为了避免歧义性写成: i=3; a=i++; b=i++; c=i++; d=a+b+c; 任何系统结果都一样。

45 3.9 赋值运算符和赋值表达式 赋值运算符 “=”就是赋值运算符。 格式:变量=表达式 赋值过程中遇到的问题:
如果赋值运算符两侧的变量和表达式的类型都为数值型时,系统自动进行类型转换。怎么转换呢?有一个原则,要尽量保持赋值前后数据的一致性。 类型转换 将实数赋给整数时舍去小数点。 将整数赋给实数时后面加0。 字符型赋给整数时将字符的8位,放在整数的低8位,高8位补零。 将int , short , long 型数据赋给 char 型变量时,只将其低8位原封不动地送到 char 中

46 3.9 赋值运算符和赋值表达式 下列表达式是合乎C语言表达式规则的表达式: a=123 a=123.456 c=a+'A' x=a+c
(x=a)+(b=3) /*合法的算术表达式*/

47 3.9 赋值运算符和赋值表达式 复合的赋值运算符和复合的赋值表达式
在赋值运算符“”前加上其他的运算符,可以构成复合的赋值运算符。如在“”前加上“”运算符就构成了“”运算符。 C语言提供了10种复合的赋值运算符,它们是 +=、-=、*=、/=、%=、<<=、>>=、&=、^=、|= 其中前5个是复合的算术赋值运算符,后5个是复合的位运算赋值运算符。复合的赋值运算符是双目运算符,优先级和赋值运算符相同,也是右结合性的。

48 3.9 赋值运算符和赋值表达式 由复合的赋值运算符构成的赋值表达式的格式为: 变量 <运算符= >确定的值 它等效于
变量=变量 <运算符 >确定的值 例如: a+= 等价于a=a+5 x*=y+7 等价于x=x*(y+7) r%=p 等价于r=r%p

49 3.10 逗号运算符和逗号表达式 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 逗号运算符的优先级是最低的。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。 逗号表达式的一般形式为: 表达式1,表达式2 逗号表达式的求值过程是顺序求解表达式1、表达式2的值,并以表达式2的值作为整个逗号表达式的值。

50 3.10 逗号运算符和逗号表达式 例2.7 main() { int a=2, b=4, c=6, x, y;
y = (x=a+b), (b+c); printf("y=%d,x=%d",y,x); } 程序运行结果为: y=6,x=6 本例中的y等于6,而逗号表达式的值y(xab),(bc)是10。

51 3.12 逻辑运算符 逻辑运算符 逻辑运算是对真和假两类种状态的运算。
逻辑运算把一切“非 0” 的数作为真(用1表示),把“0” 数作为假(用0表示)。 逻辑运算类别 非 !: 单目运算符 与 &&:双目运算符 或 ||: 双目运算符

52 3.12 逻辑运算符 逻辑运算真值表 ! 有假则假,全真则真。 有真则真,全假则假。 && || 取值 结果 非0(真) 0(假) A B
0假 非0(真) 有假则假,全真则真。 || A B 结果 0假 非0(真) 有真则真,全假则假。


Download ppt "C语言程序设计 第三章 数据类型、运算符与表达式"

Similar presentations


Ads by Google