版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第3 3章章 数据类型、运算符与表达式数据类型、运算符与表达式3.1 C3.1 C的数据类型的数据类型 算法处理的对象是数据算法处理的对象是数据, ,考虑算法时要注意数据结构。考虑算法时要注意数据结构。 数据是以种特定的形式存在的:整、实、字符等。数据是以种特定的形式存在的:整、实、字符等。 算法与编程是相辅相成的,考虑的问题有:算法与编程是相辅相成的,考虑的问题有: 1.1.数据的描述:数据的描述:称数据结构,加工处理的数据类型。称数据结构,加工处理的数据类型。 2.2.动作的描述:动作的描述:告诉计算机要的操作步骤。告诉计算机要的操作步骤。 数据结构:反映不同数据的构造形式。数据结构:反
2、映不同数据的构造形式。 不同语言所提供的数据结构是不同的,因而算法也有不同语言所提供的数据结构是不同的,因而算法也有差异。差异。 例如:对十个整数进行排序和对十个整数构成的数组例如:对十个整数进行排序和对十个整数构成的数组排序算法是不同的。排序算法是不同的。 在考虑算法时,必须考虑数据结构,以便选择最佳设在考虑算法时,必须考虑数据结构,以便选择最佳设计方案。计方案。C C语言提供的数据结构是以数据类型的形式出现的语言提供的数据结构是以数据类型的形式出现的 用指针、结构体还可构成链表、树、栈等复杂的数据结构用指针、结构体还可构成链表、树、栈等复杂的数据结构整型整型 字符型字符型 实型实型( (浮
3、点型浮点型) ) 枚举类型枚举类型单精度型单精度型 双精度型双精度型数组类型数组类型 结构体类型结构体类型 共用体类型共用体类型基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型( (void)void)数据类型数据类型3.2常量与变量常量与变量3.2.1常量和符号常量常量和符号常量 常量常量:在程序执行过程中,数值始终保持在程序执行过程中,数值始终保持不变的量。不变的量。 整型整型: 5, -26, 0 实型实型:3.14, -2.45, 2.17178 字符字符:a, 1, A, $ 标识符(符号)标识符(符号) #define pi 3.14 常量一般从其字面形式即可判别常量一
4、般从其字面形式即可判别常量例例T3-1.c T3-1.c #define PRICE 30 #define PRICE 30 main() main() int num,total; num=10; int num,total; num=10; total=numtotal=num* *PRICE; PRICE; printfprintf(“total=%d”,total); (“total=%d”,total); 输出输出: :total=300 total=300 符号常量:见名知意,程序中一改全改符号常量:见名知意,程序中一改全改. . 3.2.23.2.2变量变量 变量变量: :在程序
5、执行过程中,其值可以变化的量。在程序执行过程中,其值可以变化的量。 说明:说明: 1.1.变量名:变量名:由合法标识符由合法标识符( (函数、数组、文件、结函数、数组、文件、结构体等名称都称标识符构体等名称都称标识符) )组成。组成。 2.2.标识符构成:标识符构成: 字母、数字、下划线。第一个字符必须是字母字母、数字、下划线。第一个字符必须是字母或下划线,或下划线,如:如: abab,_12,a3c5,_12,a3c5均为合法标识符,而均为合法标识符,而 5 5ba$e,wangba$e,wang- -1 1为非法。为非法。3.3.标识符长度:标识符长度: 一般一般1818个合法字符(个合法
6、字符(TcTc中,长度达中,长度达248248个字符个字符,有效字符前,有效字符前3232个)。个)。4.4.标识符中:大小写字母是有区别标识符中:大小写字母是有区别,如,如,A A,a a是两个不同的标识符。是两个不同的标识符。 5.5.变量的使用:变量的使用:按先定义后使用的原则进行按先定义后使用的原则进行。 6.6.变量类型能进行有关运算的合法性检查变量类型能进行有关运算的合法性检查,如,如a a % b,% b,两边必须是整型数据。两边必须是整型数据。 7.7.不同类型的变量,在内存中占据不同的存储不同类型的变量,在内存中占据不同的存储单元,变量所对应的单元中存放变量的值单元,变量所对
7、应的单元中存放变量的值, , 要区分要区分变量名和变量值两个不同的概念。变量名和变量值两个不同的概念。 3.3 3.3 整型数据整型数据3.3.13.3.1整型常量整型常量 1 1、十进制整数十进制整数: :如如 29, -36 , 0 29, -36 , 0 2 2、八进制整数、八进制整数: :以以0 0开头开头, ,后跟后跟0707中中的若干数字的若干数字; ; 如如:0123 :0123 (83) (83)10103 3、十六进整制十六进整制: :以以0 x0 x开头开头, ,后跟后跟 09,A,B,C,D,E,F09,A,B,C,D,E,F(可小写)中的(可小写)中的 若干字符若干字符
8、, ,如如0 0 xA2 xA2 (162)(162)10103.3.23.3.2整型变量整型变量 1 1、整型变量在内存中的存放形式、整型变量在内存中的存放形式 数据在内存中是以二进制补码形式存放的。数据在内存中是以二进制补码形式存放的。 例:例:intint i ,j; i=10;j=-10; i ,j; i=10;j=-10; 正数的补码:与原码相同。正数的补码:与原码相同。求负数补码:求负数补码:求该数的绝对值的二进制;求该数的绝对值的二进制; 对其值求反加对其值求反加1i10 数据数据i存放示意图存放示意图数据数据i在内存中实际存放情况在内存中实际存放情况0 0 0 0 0 0 0
9、00 0 0 0 1 0 1 0-10 j数据数据j存放示意图存放示意图数据数据j在内存中实际存放情况在内存中实际存放情况1 1 1 1 1 1 1 11 1 1 1 0 1 1 02 2、整型变量的分类、整型变量的分类 根据数值的范围可定义以下类型的变量:根据数值的范围可定义以下类型的变量: 1 1、基本型:用、基本型:用int int 定义定义 2 2、短整型:、短整型:用用short int short int 或或 short short 定义定义 3 3、长整型:、长整型:用用long int long int 或或 long long 定义定义 整型:整型:unsigned int
10、 unsigned int 4 4、无符号型:、无符号型: 短整:短整:unsigned short unsigned short 长整:长整:unsigned long unsigned long 无符号数据的特点:无符号数据的特点: 最高位不是作为符号位,而是作为存放最高位不是作为符号位,而是作为存放有效数值本身,它不能存放负数。有效数值本身,它不能存放负数。 例:例:int a;/*a的数值范围为的数值范围为-32768 32767 */ unsigned int b; /*b的数值范围为的数值范围为0 65535 */ 符号位符号位有符号整型变量有符号整型变量a=327670 1 1
11、1 1 1 1 1 1 1 1 1 1 1 1 1 无符号整型变量无符号整型变量b=655351 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 数值有效位数值有效位 类型类型 比特数比特数 取值范围取值范围 int 16 -3276832767 short 16 -3276832767 long 32 -21474836482147483647 unsigned int 16 065535 unsigned short 16 065535 unsigned long 32 04294967297 ANSI 标准定义的整数类型标准定义的整数类型 3 3、整型变量的定义、整型变量的定
12、义: : 对变量强制类型定义的目的:让对变量强制类型定义的目的:让编译为其分配内存单元。编译为其分配内存单元。 各种变量的定义一般在函数的开始部分,也可以在各种变量的定义一般在函数的开始部分,也可以在分程序分程序 中定义,若在分程序中定义,其作用域仅在中定义,若在分程序中定义,其作用域仅在分程序中有效。分程序中有效。 例例T3-2.c T3-2.c main( ) main( ) int int a,b,c,d; a,b,c,d; unsigned int unsigned int u; u; a=12; b=-24; u=10; a=12; b=-24; u=10; c=a+u; d=b+u
13、; c=a+u; d=b+u; int int a;a=8a;a=8* *9;9; printf printf(“a=%dn”,a);(“a=%dn”,a); / /* *加上此复合语句结果加上此复合语句结果 ? * */ / printf printf(“a+u=%d,b+u=%dn”,c,d); (“a+u=%d,b+u=%dn”,c,d); 运算结果:运算结果:a+u=22, b+u=-a+u=22, b+u=-14 14 由此可见:由此可见: 不同类型的整型数不同类型的整型数据可以进行混合运算据可以进行混合运算4 4、整型数据的溢出、整型数据的溢出 intint型变量最大允许值为型变量
14、最大允许值为32767,32767,如果大于此数,将产生溢出如果大于此数,将产生溢出 例例3.3 3.3 整型数据的溢出情况整型数据的溢出情况 main( ) main( ) int int a,b; a,b; a=32767; b=a+1; a=32767; b=a+1; printf printf(“%d,%d”,a,b); (“%d,%d”,a,b); 运行结果:运行结果:32767,-32768 32767,-32768 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1a: 32767 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0b: -32768 从上
15、图可知,变量从上图可知,变量a a的最高位为的最高位为0,0,低低1515位为位为1 1,表示,表示32767 32767 而变量而变量b b最高位为最高位为1,1,低低1515位为位为0,0,表示表示-32768-32768。 此种情况,编译系统不会报错,这要靠编程者的细心和此种情况,编译系统不会报错,这要靠编程者的细心和经验。经验。3.3.33.3.3、整型常量的类型、整型常量的类型 整型常量本身隐含了某种数据类型,将整型常量赋整型常量本身隐含了某种数据类型,将整型常量赋给整型变量时,要考虑常量的大小和变量所能表示的给整型变量时,要考虑常量的大小和变量所能表示的数据范围。数据范围。 一个整
16、数,其值在如下范围:一个整数,其值在如下范围: (1 1)-3276832767 -3276832767 int ,short int, long int int ,short int, long int (2 2)-21474836482147483647 -21474836482147483647 long int long int (3 3)对于非负数,)对于非负数, 如:如:065535 065535 unsigned intunsigned int,unsigned short ,unsigned short 04294967295 04294967295 unsigned long
17、 unsigned long 说明:说明: 1.1.常量中无常量中无 unsigned unsigned 类型的数,正整数可赋给类型的数,正整数可赋给unsigned unsigned 变变量,只要数值不超过范围。量,只要数值不超过范围。 2.2.在整型常量后加在整型常量后加 l l 或或 L L 表示长整型常量,如表示长整型常量,如:456:456L L。 3.3.在函数调用时,若被调用函数的形参是长整型变量,则要求在函数调用时,若被调用函数的形参是长整型变量,则要求主调函数的实参也是长整型数据。主调函数的实参也是长整型数据。3.4 3.4 实型数据实型数据3.4.1 3.4.1 实型常量的
18、表示方法实型常量的表示方法 实数又称浮点数实数又称浮点数 1.1.十进制形式:由数字和小数点组成,如:十进制形式:由数字和小数点组成,如:3.14, 0.26, 0.0, 326.45 3.14, 0.26, 0.0, 326.45 2. 2.指数形式:由尾数部分、字母指数形式:由尾数部分、字母e e 或或E E、指数部分组成。、指数部分组成。 如:如:48.62e+12 , 48.62e+12 , 其中:其中:48.6248.62为尾数,为尾数, +12+12为指数,为指数, e e为基数为基数10,10,它表示它表示48.6248.62 1010 12 12 C C规定:规定:e e的前面
19、要有数字,的前面要有数字,e e的后面要有整数。的后面要有整数。 3.4.23.4.2实型变量实型变量1 1、实型数据在内存中的存放形式、实型数据在内存中的存放形式 float float 型变量:型变量:3232位位 doubledouble型变量:型变量:6464位位 数符数符 阶符阶符 d29 ( 7位阶码位阶码) d23 d22 (23位规格化数补码)位规格化数补码) d0 2127-11038数符数符 阶符阶符 d61 (10位阶码)位阶码)d52 d51 (52位规格化数补码)位规格化数补码) d021024-1103082 2、实型变量的分类、实型变量的分类 floatfloat
20、型表示数的范围:型表示数的范围: 最大正数:(最大正数:(1-21-2 -23 -23) 2 2 127 127=10=10 38 38最小负数:最小负数:-1-1 2 2 127 127 = -10 = -10 38 38 接近接近0 0的正数:的正数:2 2 -1 -1 2 2 -128-128 = 3.9 = 3.9 10 10 -38-38 接近接近0 0的负数:的负数:- -(2 2-1-1 + 2 + 2-23-23) 2 2-128-128 = -3.9 = -3.9 10 10 -38-38 double double型表示数的范围:型表示数的范围: 最大正数:(最大正数:(1
21、-21-2-52-52 ) 2 210231023 = 10 = 10 308 308 最小负数:最小负数:-1 -1 2 210231023 = -10 = -10308308 接近接近0 0的正数:的正数:2 2-1 -1 2 2-1024-1024 =10 =10-308-308 接近接近0 0的负数:的负数:- -(2 2-1-1 + 2 + 2-52-52) 2 2-1024-1024 =-10 =-10-308 -308 long double long double型表示数的范围:型表示数的范围: 最大正数:最大正数:-10-10-4931-4931 10 1049314931
22、实型常量可赋给实型常量可赋给 float float 或或doubledouble型变量,型变量,根据变量类型截取实型常量的有效位。根据变量类型截取实型常量的有效位。 单精度实型数据(单精度实型数据(floatfloat)表数范围:)表数范围: 十进制形式:十进制形式:7 7位有效位位有效位 指数形式:指数形式: . . e e 双精度实型数据(双精度实型数据(double)double)表数范围:表数范围: 十进制形式:十进制形式:1616位有效位位有效位 指数形式:指数形式: . . e e 双精度实型数据双精度实型数据( (long double) long double) 表示数据范围
23、:表示数据范围: 十进制形式:十进制形式:1616位有效位位有效位 指数形式:指数形式: . . e e x x 3 3、实型数据的舍入误差、实型数据的舍入误差 实型数据是由有限的存储单元来存储的实型数据是由有限的存储单元来存储的,因此提供的有效数,因此提供的有效数字总是有限的,在有效位以外的数字将被舍去,由此可能会有字总是有限的,在有效位以外的数字将被舍去,由此可能会有一些误差。一些误差。 例例T3-4.c T3-4.c main( ) main( ) float a,b; long double c; a=123456.678e5; float a,b; long double c; a=
24、123456.678e5; b=a+20; c=123456789.123456789e4923; b=a+20; c=123456789.123456789e4923; printf printf(“a=%fn b=%fn c=%Lfn”,a,b,c); (“a=%fn b=%fn c=%Lfn”,a,b,c); 输出结果:输出结果: a=12345678848.000000 a=12345678848.000000 b=12345678848.000000 b=12345678848.000000 c=1.234567891234567890000000000000000000000e+4
25、931 c=1.234567891234567890000000000000000000000e+4931 a a的值比的值比2020大的多,大的多,a+20a+20的理论值是的理论值是12345678920,12345678920,而实型变而实型变量有效位只有量有效位只有7 7位,因此,后面的数字是无意义的位,因此,后面的数字是无意义的,应避免将一,应避免将一个很大的数和一个很小的数相加或相减,以免造成误差。个很大的数和一个很小的数相加或相减,以免造成误差。3.4.3 3.4.3 实型常量的类型实型常量的类型 1 1、未加说明,系统将实型常量作为双精度处理、未加说明,系统将实型常量作为双精度
26、处理 例:例: float f; float f; f=2.45678f=2.45678* *4532.65 4532.65 系统将两数按双精度运算,然后将前系统将两数按双精度运算,然后将前7 7位赋给实型变量位赋给实型变量f, f, 缺点:浪费系统资源,降低运算速度;缺点:浪费系统资源,降低运算速度; 解决的办法:解决的办法:在数的后面加在数的后面加f f,如,如2.456782.45678f f,系统将其按单精,系统将其按单精度数运算。度数运算。 2 2、实型常量赋给、实型常量赋给floatfloat或或doubledouble类型变量时,根据变量的类型类型变量时,根据变量的类型截取实型常
27、量的有效位。截取实型常量的有效位。 例例T3-4-1.c T3-4-1.c main( ) main( ) float f1; double f2; f1=111111.111; f2=111111.11111; float f1; double f2; f1=111111.111; f2=111111.11111; printf printf(“f1=%fnf2=%lfn”,f1,f2); (“f1=%fnf2=%lfn”,f1,f2); 输出结果:输出结果:f1=111111.109375 f1=111111.109375 f2=111111.111110 f2=111111.111110
28、3.5 3.5 字符型数据字符型数据3.5.13.5.1字符常量字符常量 字符常量:用一对单引号括起的一个字符,如字符常量:用一对单引号括起的一个字符,如a, A , # a, A , # , 9, 9说明:说明:1. 1. 字符常量的值是该字符在字符常量的值是该字符在ASCIIASCII码中的码值码中的码值。 2. a 2. a 和和A A 是两个不同的字符常量,是两个不同的字符常量,a a 97, 97, AA 65 65 3. 3. 开头的字符序列称为特殊形式的字符常量(转义字符开头的字符序列称为特殊形式的字符常量(转义字符) 常用的转义字符功能及码值常用的转义字符功能及码值 转义字符转
29、义字符 功功 能能 十进制的十进制的ASCII码值码值 a 响铃响铃 7 b 退格退格 8 f 换页换页 12 n 换行换行 10 r 回车回车 13 t 横向跳八格横向跳八格 9 ddd 三位八进制三位八进制 101 A xhh 两位十六进制两位十六进制 x42 B 例例 T3-5.c main ( ) printf (“-n”); printf (“ -ab-ct-derftgn”); printf (“htibbj-kn”); 运行后运行后屏幕显示屏幕显示结果:结果: - f gde h j-k 注意:打印机和屏幕显示结果注意:打印机和屏幕显示结果不同。不同。不会象屏幕那样会不会象屏幕那
30、样会“抹抹掉掉”原字符,能够真正反映输原字符,能够真正反映输出的过程和结果。出的过程和结果。 运行后运行后打印机显示打印机显示结果:结果: - fab gde h jik 3.5.2 字符变量字符变量 字符变量:用于存放一个字符常量字符变量:用于存放一个字符常量。 字符变量的定义形式:字符变量的定义形式: 如:如: char c1,c2; /*定义定义c1,c2为字符型变量,占一个字节为字符型变量,占一个字节*/ c1=a; c2=b; /*将字符常量将字符常量 a, b 赋给赋给c1和和c2 */2 2.5.3 .5.3 字符数据在内存中的存储形式及使用方法字符数据在内存中的存储形式及使用方
31、法 字符常量存放到字符变量中,是把其字符常量存放到字符变量中,是把其ASCIIASCII码值码值存放到内存存放到内存中,由于其存储形式与整数存储形式相似,所以整、字符型数中,由于其存储形式与整数存储形式相似,所以整、字符型数据之间可通用。据之间可通用。例例T3-6.c T3-6.c main( ) main( ) char c1,c2; char c1,c2; c1=97; c2=98; c1=97; c2=98; printf (“c1=%c,c2=%c n”,c1,c2); printf (“c1=%c,c2=%c n”,c1,c2); printf printf (“c1=%d,c2=%
32、d n”,c1,c2); (“c1=%d,c2=%d n”,c1,c2); 运行结果:运行结果:c1=a, c2=b c1=a, c2=b c1=97,c2=98 c1=97,c2=98c1c29798内存中变量内存中变量c1、c2的值的值c1c2内存中变量内存中变量c1、c2实际存储形式实际存储形式0 1 1 0 0 0 0 10 1 1 0 0 0 1 0例例T3-7.c大小写字母的转换大小写字母的转换 main( ) char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; printf (c1=%c,c2=%cn”,c1,c2); 运行结果:运行结果:c1
33、=A, c2=B 0 1 1 0 0 0 0 1a存储(存储(ASCII码码)“%c”“%d”a97输出格式符输出格式符显示显示例例T3-7-1.c T3-7-1.c 字符数据与整型数据之间可以相互赋值字符数据与整型数据之间可以相互赋值 main( ) main( ) int int i; i; char c; char c; c=97; i=a; c=97; i=a; printf printf (“%c , %dn”, c, c); (“%c , %dn”, c, c); printf printf (“%c , %dn”, i, i ); (“%c , %dn”, i, i ); 运行结
34、果:运行结果:a , 97 a , 97 a , 97 a , 97 在在Turbo C Turbo C 中,字符数据占一个字节,当中,字符数据占一个字节,当ASCII ASCII 码值在码值在128255128255之间时,其最高位为之间时,其最高位为1,1,占据了符号位占据了符号位,以数据输出时为负数,以字符输出时是对应的字符以数据输出时为负数,以字符输出时是对应的字符,以无符号数据输出时,也是其对应的数据。,以无符号数据输出时,也是其对应的数据。例:例: T3-7-2.c T3-7-2.c main ( ) main ( ) char c1=376 ; char c1=376 ; uns
35、igned char c2=376; unsigned char c2=376; printf printf(“%d, %cn”,c1,c1); (“%d, %cn”,c1,c1); printf printf(“%d ,%cn”,c2,c2); (“%d ,%cn”,c2,c2); 运行结果:运行结果: -2 , -2 , (-2-2的补码)的补码) 254, 254, 1 1 1 1 1 1 1 01 1 1 1 1 1 1 0数值位数值位符号位符号位Char c1 Unsigned c23.5.4 3.5.4 字符串常量字符串常量 字符串常量:用一对双引号括起的字符序列。字符串常量:用一
36、对双引号括起的字符序列。 如:如:“BEIJING” , “CHINA” , “$123” , “a”BEIJING” , “CHINA” , “$123” , “a” 字符串使用的有关说明:字符串使用的有关说明: 1.1. 字符串可出现在输出函数中;字符串可出现在输出函数中; 如:如:printfprintf (“This is a C program. n”); (“This is a C program. n”); 2. 2. 字符常量与字符串常量是不同的字符常量与字符串常量是不同的; ; 如:如:char c1, c2; char c1, c2; c1=a; c1=a; 可以可以 c2
37、=“a” ; c2=“a” ; 错误错误 不能把字符串赋给字符型变量,字符串在内存中存放不能把字符串赋给字符型变量,字符串在内存中存放时,系统自动加字符串结束符时,系统自动加字符串结束符 0 0 ,该字符在,该字符在ASCIIASCII码中的码值为码中的码值为0 0,是空操作符,即无动作,不显示。,是空操作符,即无动作,不显示。 a 0 a a 0 a3. C3. C中无字符串变量,字符串可以赋给字符数中无字符串变量,字符串可以赋给字符数组组; ;4.4.若字符串为若字符串为“CHINA” ,CHINA” ,它在内存中的实际它在内存中的实际存储形式是:存储形式是: 其长度是其长度是6 6而不是
38、而不是5,5,最后一个字符是最后一个字符是0,0,是系统自动加上的,不能人为加上此是系统自动加上的,不能人为加上此字符,它既无显示或打印输出也无任何动作。字符,它既无显示或打印输出也无任何动作。 C H I N A 0 3.6 3.6 变量赋初值变量赋初值方法有:方法有: 1.1. 定义的同时给变量赋初值定义的同时给变量赋初值 如:如:int int a=3; float b=3.1415; char c=x; a=3; float b=3.1415; char c=x; 2.2.定义变量时,可以对其中的一部分变量赋初值定义变量时,可以对其中的一部分变量赋初值 如:如: int int a=3
39、, b, c, d=8; a=3, b, c, d=8; 3.3.把一个常量赋给不同变量时,最好分别进行。把一个常量赋给不同变量时,最好分别进行。 如:如:intint a=b=c=3; a=b=c=3; 而应写为:而应写为:int int a=3,b=3,c=3; a=3,b=3,c=3; 4.4.初始化是在程序运行时,执行本函数时赋以初值的。初始化是在程序运行时,执行本函数时赋以初值的。 如:如:int int a=3; a=3; 相当于:相当于:int int a; a=3; a; a=3; 3.73.7各类数值型数据间的混合运算各类数值型数据间的混合运算 在在C C语言中,整、实、字符
40、型数据间可以混合运算语言中,整、实、字符型数据间可以混合运算 一、不同类型数据间进行运算时,要转换成同一类型一、不同类型数据间进行运算时,要转换成同一类型 转换过程中,低类型向高类型靠拢,然后进行运算,不同转换过程中,低类型向高类型靠拢,然后进行运算,不同类型之间转换如下图所示,类型之间转换如下图所示,横向左箭头为必转,纵向箭头表示横向左箭头为必转,纵向箭头表示有条件类型转换。有条件类型转换。 高高 double float long unsigned 低低 int char , chort二、类型转换进一步说明二、类型转换进一步说明 1. 1. 当两数都为当两数都为float float 时
41、,都要转换为时,都要转换为doubledouble型型 2. 2. 当一个为当一个为floatfloat型,而另一个为型,而另一个为char char 型时,则都要型时,则都要转换为转换为doubledouble型。型。 3. 3. 当一个为当一个为longlong型,而另一个为型,而另一个为 int int 型时,则将另一个也型时,则将另一个也转换为转换为longlong型型 例:例:T3-7-3.c T3-7-3.c main( ) main( ) float a; float a; double b; double b; a=10+ a + 1.5 - 8765.1234 a=10+ a
42、 + 1.5 - 8765.1234 * * b; b; b=10 + a +1.5 - 8765.1234 b=10 + a +1.5 - 8765.1234 * * b; b; printf printf (“a=%f , b=%f n”, a,b); (“a=%f , b=%f n”, a,b); 运行结果:运行结果:a=-858873.562500 , b=-858873.593200a=-858873.562500 , b=-858873.5932003.83.8算术运算符和算术表达式算术运算符和算术表达式3.8.1 C3.8.1 C运算符简介运算符简介 除控制语句除控制语句( (i
43、f, while,forif, while,for) )和输入和输入/ /输出函数;大部输出函数;大部分操作都作为运算符处理。分操作都作为运算符处理。 1. 1. 算术运算符:算术运算符:+ + 、- -、* * 、 / / 、% % 2. 2. 关系运算符:关系运算符: 、=、 、=、= = =、!= != 3. 3. 逻辑运算符:逻辑运算符:! !、&、| | 4. 4. 位运算符:位运算符: 、 、| |、 、& & 5. 5. 赋值运算符:赋值运算符:= = 6. 6. 条件运算符:条件运算符:? ? : 7. 7. 逗号运算符:逗号运算符:, , 8. 8.
44、指针运算符:指针运算符:* *、 & & 9. 9. 求字节数运算符:求字节数运算符:sizeof sizeof 10. 10. 强制类型转换运算符:强制类型转换运算符:( (类型类型) ) 11. 11. 分量运算符:分量运算符: 、12. 12. 下标运算符:下标运算符: 、 13. 13. 其它运算符:如函数调用其它运算符:如函数调用2.8.22.8.2算术运算符和算术表达式算术运算符和算术表达式 1 1、基本的算术运算符、基本的算术运算符 + +:加法或正值运算符,如:加法或正值运算符,如:2+3 2+3 、+5 +5 - -:减法或负值运算符,如:减法或负值运算符,如
45、:8-3 8-3 、-6 -6 * *:乘法运算符,如:乘法运算符,如:3 3* *5 5 / : / : 除法运算符,两个可以是整或实型除法运算符,两个可以是整或实型数据。数据。 % %:求余运算符:求余运算符 两个必是整型数据。两个必是整型数据。例例T3-7-4.c T3-7-4.c 整型数据除法运算整型数据除法运算 main ( ) main ( ) int int a,b,c; a,b,c; a=5; a=5; b=3; b=3; c=a/b; c=a/b; printf printf(“c=%dn”,c); (“c=%dn”,c); 运算结果:运算结果:c=c=1 1 例例 T3-7
46、-5.cT3-7-5.c实型数据除法运算实型数据除法运算 main ( ) main ( ) float a,b,c; float a,b,c; a=5; b=3; a=5; b=3; c=a/b; c=a/b; printf printf (“%fn”,c); (“%fn”,c); 运算结果:运算结果:1.666667 1.666667 说明:说明: (1)(1)整数除法中一个数为负时,结果取整后向整数除法中一个数为负时,结果取整后向0 0靠拢,靠拢, 如:如:-5/3= -1 5/(-3)= -1 -5/3= -1 5/(-3)= -1 8/(-3)= -2 -8/3= -2 8/(-3)
47、= -2 -8/3= -2 (2)(2)取余运算符两则必须是整型数据,余数与被除数同号取余运算符两则必须是整型数据,余数与被除数同号 如:如:-29%4=-7 -29%4=-7 余余-1 -1 29%(-4)=-7 29%(-4)=-7 余余1 1 -52%7=-7 -52%7=-7 余余-3 -3 52%(-7)=-7 52%(-7)=-7 余余 3 32 2、算术表达式和运算符的优先级与结合性、算术表达式和运算符的优先级与结合性算术表达式:算术表达式: 用算术运算符和括号将运算对象(常量、变量、用算术运算符和括号将运算对象(常量、变量、函数)连接起来的,符合函数)连接起来的,符合C C语言
48、语法规则的式子。语言语法规则的式子。 如:如:a a* *b/c-1.5+ab/c-1.5+a 在在C C语言中,运算符共有语言中,运算符共有1515个优先级,其中算术运个优先级,其中算术运算符的优先级是:算符的优先级是: * *、/ / 、% %(3 3级)级) + + 、- -(4 4级)级) 算术运算符的结合方向:从左向右算术运算符的结合方向:从左向右 如:如:a-b+c a-b+c :算符优先级相同,结合性:从左向右:算符优先级相同,结合性:从左向右 a-ba-b* *c c :算符:算符* *的优先级高于的优先级高于- - 若运算符两侧的运算对象类型不同时,低类型向若运算符两侧的运算
49、对象类型不同时,低类型向高类型转换高类型转换3 3、强制类型转换运算符、强制类型转换运算符一般形式:一般形式: (类型名)(类型名) (表达式)(表达式) 如如 (double)a double)a 将将a a转换为转换为doubledouble型型 ( (intint)(x+y) )(x+y) 将将x+yx+y的值转换为整型的值转换为整型 (float)(5%3) (float)(5%3) 将将5%35%3的值转换成单精度实型的值转换成单精度实型 说明:说明: 1.1.(intint)(x+y) )(x+y) 与与( (intint)x+y )x+y 意义不同意义不同 2. 2. 类型转换后
50、得到一个中间值,而原来变量的类型没有发类型转换后得到一个中间值,而原来变量的类型没有发生变化。生变化。 例例T3-8.c T3-8.c main( ) main( ) float x , i; float x , i; x=3.6; x=3.6; i=(int) (x); i=(int) (x); printf printf (“x=%f, i=%fn”,x,i); (“x=%f, i=%fn”,x,i); 运算结果:运算结果:x=3.600000, i=3.000000 x=3.600000, i=3.000000例例T3-8-1.c T3-8-1.c main( ) main( ) flo
51、at a,b,c,d; float a,b,c,d; int int e,f ; e,f ; a=5;b=3; a=5;b=3; c=a/b; c=a/b; d=(float)(5%3); d=(float)(5%3); e=(int e=(int)(a/3); )(a/3); f=(int) (b+3.8); f=(int) (b+3.8); printf printf(“c=%f, d=%f, e=%d, f=%dn”,c,d,e,f); (“c=%f, d=%f, e=%d, f=%dn”,c,d,e,f); 运算结果:运算结果:c=1.666667,d=2.000000,e=1,f=6
52、 c=1.666667,d=2.000000,e=1,f=6 思考:思考: 程序运行期间程序运行期间,a,ba,b的值发生变的值发生变化没有?化没有? 答案:答案:a,ba,b之值没之值没有发生变化。有发生变化。4、自增、自减运算符、自增、自减运算符 + +:增:增1运算符,使变量值增运算符,使变量值增1。 - - :减:减1运算符,使变量值减运算符,使变量值减1。 如如:+i ,-i:在使用变量:在使用变量i之前,先使变量之前,先使变量i加(减)加(减)1。 i+,i-:在使用变量:在使用变量i之后,使变量之后,使变量i值加(减)值加(减)1。 例例T-.c main( ) int i,j;
53、 i=3; j=+i; printf (“i=%d,j=%dn”,i,j); 运算结果:运算结果:i=4,j=4例例T3-8-3.c main( ) int i,j; i=3; j=i+; printf (“i=%d,j=%dn”,i,j); 运算结果:运算结果:i=4,j=3 说明:说明: 1.+,-运算符只能用于变量,而不能用于常量和表达式。运算符只能用于变量,而不能用于常量和表达式。 如如a+,b-是正确的,而是正确的,而5+,(x+y)-却是错误的。却是错误的。 2.+,- -运算符的结合方向是从右向左。运算符的结合方向是从右向左。例例T3-8-4.c main( ) int i; i
54、=3; printf (“i1=%dn”,-i+); printf (“i2=%dn”,i); 运算结果:运算结果:i1=-3 i2=4 例例T3-8-5.c main( ) int i; i=3; printf (“i1=%dn”,-+i); printf (“i2=%dn”,i); 运算结果:运算结果:i1= - 4 i2= 45、有关表达式使用中的问题说明、有关表达式使用中的问题说明 (1)C中的运算符和表达式中的运算符和表达式: 表达式中的子表达式的求值顺序各编译系统是有差别的。表达式中的子表达式的求值顺序各编译系统是有差别的。 如对表达式:如对表达式: a=f1( ) + f2( )
55、 一般情况下是先调用一般情况下是先调用f1( ),再调用再调用f2( ),先后次序无关紧要,先后次序无关紧要,但有些情况,结果却不同,编程时要注意所用的编译系统。但有些情况,结果却不同,编程时要注意所用的编译系统。 我们主要是以我们主要是以Turbo C加以讨论。加以讨论。 若若 int i; i=3; 又如表达式:又如表达式: (i+) + (i+) + (i+) ; 有的系统的求值顺序是先求第一个,再求第二个,最后求有的系统的求值顺序是先求第一个,再求第二个,最后求第三个子表达式,其结果是:第三个子表达式,其结果是: 3+4+5=12, 最后最后i的值为的值为6 而在而在Turbo C中却
56、有所不同:中却有所不同: 其结果是:其结果是:9,i自加三次以后为自加三次以后为6。 例例T3-8-6.c T3-8-6.c main( ) main( ) int int i=3,j=3,k,q; i=3,j=3,k,q; k=(i+)+(i+)+(i+); k=(i+)+(i+)+(i+); q=(+j)+(+j)+(+j); q=(+j)+(+j)+(+j); printf printf (“i=%d,j=%d,k=%d,q=%dn”,i,j,k,q); (“i=%d,j=%d,k=%d,q=%dn”,i,j,k,q); 运算结果:运算结果:i=6,j=6,k=9,q=18i=6,j=6
57、,k=9,q=18 上述情况有时往往造成混淆,解决的方法:把各上述情况有时往往造成混淆,解决的方法:把各中间结果先计算送各中间变量,然后相加。中间结果先计算送各中间变量,然后相加。 例例T3-8-7.c main( ) int i,j,x,y ; i=3; j=30; x=(i+)+(i+)+(+i)+(+i); y=(j-)+(j-)+(-j)+(-j); printf (“i=%d,j=%d,x=%d,y=%dn”,i,j,x,y); 运算结果:运算结果:i=7,j=26,x=20,y=112原因:原因:X=3+3+7+7=20X=3+3+7+7=20Y=30+30+26+26=112Y=
58、30+30+26+26=112(2)在在C语言中运算符的确定语言中运算符的确定 在由多个字符组成的表达式中,应尽可能多地从左向右将在由多个字符组成的表达式中,应尽可能多地从左向右将若干个字符组成一个运算符。若干个字符组成一个运算符。 如:如:i+j 其结合性是:其结合性是:(i+) +j 而不是:而不是:i+(+j) 。 (3)printf 函数输出实参的顺序函数输出实参的顺序 如:如:int i=3; printf (“%d,%dn”,i,i+); 有的系统按从左到右的顺序求值,输出结果是:有的系统按从左到右的顺序求值,输出结果是:3,3 而而Turbo C 是按从右到左顺序求值,输出结果是
59、:是按从右到左顺序求值,输出结果是:4,3 结论:结论: 不写别人甚至自己都看不懂的程序,也不写那些不知道系统不写别人甚至自己都看不懂的程序,也不写那些不知道系统会怎样运行的程序会怎样运行的程序3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式1、赋值运算符、赋值运算符 “=”是赋值号,也是赋值运算符是赋值号,也是赋值运算符 功能:将赋值号右边表达式的值赋给赋值号左边的变量,功能:将赋值号右边表达式的值赋给赋值号左边的变量,赋值号同时含有计算赋值号同时含有计算 的功能。的功能。 如:如:a=3; b=x*y; 注意:注意: a,b变量中原来不管存放什么值,执行赋值语句后,新值变量中原来不管存
60、放什么值,执行赋值语句后,新值将将 取代旧值取代旧值 。2、类型转换、类型转换 变量类型的不同,所接收的数据也是不同的,当赋值运变量类型的不同,所接收的数据也是不同的,当赋值运算符两侧的数据类型不一致时,在赋值时要进行类型转换。算符两侧的数据类型不一致时,在赋值时要进行类型转换。 (1)实型数据赋给整型变量时,舍去实型数据的小数部分。实型数据赋给整型变量时,舍去实型数据的小数部分。 如:如:int i; i=3.56; 结果结果i的值为的值为3 (2)整型数据赋给实型变量时,数值不值,但以浮点形式存整型数据赋给实型变量时,数值不值,但以浮点形式存放于内存。放于内存。 如:如: float a=23; 先将先将23转换成转换成23
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 33543.3-2017海洋能术语 第3部分:电站》
- 深度解析(2026)《GBT 33489-2025展览会信息管理系统建设规范》
- 深度解析(2026)《GBT 33366-2016电子机柜用铝合金挤压棒材》
- 医疗数据安全标准对接:技术风险防控
- 医疗数据安全成熟度评估:区块链驱动的数据价值挖掘
- 胫骨平台骨折护理常规
- 医疗数据安全区块链技术的行业应用案例集锦
- 医疗数据安全分级区块链系统性能优化方案
- 医疗数据安全共识机制的创新与实践
- 医疗数据安全共享技术应用
- 教育学开题报告模板
- 化学品(氩气+二氧化碳混合气)安全技术使用说明书
- 高新区七年级上学期语文期末试卷
- 【MOOC】生命的教育-浙江大学 中国大学慕课MOOC答案
- 房屋租赁合同excel表
- 2024版七年级下册美术模拟试卷
- 大学生创业设计指导 课件 项目一 路演敲开创业之门
- 羊寄生虫综合防控技术规范
- 工业建筑构造(房屋建筑课件)
- 一种X射线多层膜反射镜及其制作方法与流程
- 城市生态与城市环境重点
评论
0/150
提交评论