




已阅读5页,还剩74页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
下一讲,第2章:基本数据类型、运算符与表达式,学习的意义,学习C语言的目的是什么? 目的可能是为了: 期末考试 等级考试 研究生考试 程序员考试 ,最终目的是:用C语言编写程序来解决实际问题!,程 序 是什么?,程序是解决某种问题的一组指令的有序集合。 著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式: 程序 = 数据结构 + 算法,学习的意义,程序是什么?,对数据的描述。在C语言中,体现为数据类型的描述!,对数据处理的描述。是为解决一个问题而采取的方法和步骤,是程序的灵魂!,结论:学好C语言首先就必须十分了解C语言的数据类型、运算符与表达式。,掌握变量和常量的概念; 理解各种类型的数据在内存中的存放形式; 掌握各种类型数据的常量的使用方法; 掌握各种整型、字符型、浮点型变量的定义和引用方法; 了解调用printf函数输出各种类型数据的方法; 掌握数据类型转换的规则以及强制数据类型转换的方法; 掌握赋值运算符、算术运算符、位运算符、逗号运算符以及sizeof的使用方法; 理解运算符的优先级和结合性的概念,记住所学的各种运算符的优先级关系和结合性。,学习目标,2.1.1 C语言数据类型,数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作,本章所介绍的数据类型,2.1.2数据在计算机内的存储形式,字符型数据是以ASCII码值存储在计算机中,占用1个字节,例如字符A存放形式:,例如字符E存放形式:,A的ASCII码值65,E的ASCII码值69,整型数据存储在计算机中,占用2个字节,例如9存放形式:,最高位是符号位,其值0表示正数,1表示负数。,例如-9存放形式:,2.1.2数据在计算机内的存储形式,单精度实型数据存储在计算机中,占用4个字节,例如26.7510=(11010.11)2 =(-1)025 (0.1101011)2 26.75的存储形式:,S,M,E,31 30 8 7 0,其中S表示数值的正负号,0表示正,1表示负。 M表示规格化的数值,即小数的首位不为0。M确定了数值的精度。 E用移码表示指数。 浮点数的一般表达形式(-1)S 2e规格化的尾数 E= 27 +e -27e27,-26.75的存储形式:,2.2 常量、变量和标识符 1. 标识符 定义:用来标识变量、常量、函数等的字符序列 组成: 只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线 C语言的关键字不能用作变量名 大小写敏感 长度:有效长度为32个字符。随系统而异,但至少前8个字符有效 命名原则: 变量名和函数名中的英文字母一般用小写,以增加可读性 见名知意 不宜混淆 如l与I, o与0,在TC2.0及BC3.1中,变量名(标识符)的有效长度为个字符,缺省值为,但在VC中其长度可达到255,例:判断下列标识符号合法性 sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char ab _above $123,M.D.John,3days,#33,char,$123,ab,.字符非法,数字3不可作首字符,#字符非法,char是关键字,字符非法,$不可作首字符,2.2 常量、变量和标识符 2. 常量 定义:程序运行时其值不能改变的量(即常数) 常量的分类 : 直接常量( 值常量或称为字面产量) 整型常量: 10、15、-10、-30 实型常量: 12.5、 30.0、-1.5 字符常量: A、b、c 字符串常量: “sum”、“A”、“123” 符号常量 用标识符来代表常量。 其定义格式为:,#define 符号常量 常量,#define NUM 20 #define PI 3.1415926,#include #define PRICE 30 void main ( ) int num, total; num = 10; total = num * PRICE; printf (“total = %d“, total); ,运行结果:total = 300,2.2 常量、变量和标识符 3. 变量 定义:程序运行时其值可以被改变的量 变量的两要素 :变量名 、变量值 变量的定义格式 : 变量的初始化:定义时赋初始值 变量的使用:先定义,后赋值 变量定义位置:一般放在函数开头,存储类型 数据类型 变量名1,变量名2,变量名n;,int x, y, z; float radius, length, area; char ch;,决定分配字节数 和数的表示范围,合法标识符,例: int a = 2, b, c = 4; float data = 3.67; char ch = A; int x = 1, y = 1, z = 1;,例1: int student; stadent = 19; /Undefined symbol statent in function main,例2: float a,b,c; c = a % b; /Illegal use of floating point in function main,2.3 简单数据类型与表示范围,1. 整型数据,整型常量,十进制整数:由数字09和正负号表示 . 如:123,-456,0 八进制整数:由数字0开头,后跟数字07表示.如:0123,011 十六进制整数:由0x或0X开头,后跟09,af,AF表示.如0x123,0Xff,定义整数的符号常量 #define NUM1 20 /十进制数20 #define NUM2 020 /八进制数(十进制16) #define NUM3 0x2a /十六进制数(十进制42),思考题:下列整型常量哪些是非法的? 012,oX7A,00,078,0x5Ac,-0xFFFF,0034,7B。,首字符不能是字母o,八进制数中不能有数字8,十进制数中不能有字母B,2. 整数在内存中的表示,整数的数值在内存中用补码的形式存放。 求一个整数补码的方法:(假设用n个二进制位的内存单元来存储它),如果是正整数,采用符号-绝对值表示,即最高有效位(符号位)为0表示正,数的其余部分则表示数的绝对值; 如果是负整数,则先写出与该负数相对应的正数的补码表示,然后将其按位求反,最后在末位(最低位)加1; 然后将上述求得的补码的低n位存放于内存单元之中,就得到了该整数在内存中的表示,内存单元的最高位是符号位(0表示正,1表示负)。,在TC2.0或BC3.1下,一个整数默认情况下需要2个字节(16位)的内存单元存放;而在VC6.0下,则需要4个字节(32位)。,2. 整数在内存中的表示,十进制整数,13: 对于16位的内存单元:,符号位,十进制数+13两个字节的内存实际存放形式,(+13)补 = 0000 0000 0000 1101,2. 整数在内存中的表示,十进制整数,13: 对于32位的内存单元:,十进制数+13四个字节的内存实际存放形式,(+13)补 = 0000 0000 0000 0000 0000 0000 0000 1101,符号位,记住:数据在内存中的存放位置是高位数字放在高地址的存储单元中,低位数字放在低地址的存储单元中。,2. 整数在内存中的表示,十进制整数, 13: 对于16位的内存单元:,符号位,十进制数-13两个字节的内存实际存放形式,(+13)补 = 0000 0000 0000 1101,(-13)补 = 1111 1111 1111 0011,2. 整数在内存中的表示,十进制整数, 13: 对于32位的内存单元:,十进制数-13四个字节的内存实际存放形式,(+13)补 = 0000 0000 0000 0000 0000 0000 0000 1101,符号位,(-13)补 = 1111 1111 1111 1111 1111 1111 1111 0011,2. 整数在内存中的表示,十进制整数,65537: 对于16位的内存单元:,(+65537)补 = 01 0000 0000 0000 0001,(-65537)补 = 10 1111 1111 1111 1111,十进制数-65537两个字节的内存实际存放形式,符号位,真值为:-1,不是-65537!,2. 整数在内存中的表示,十进制整数, 65537: 对于32位的内存单元:,十进制数-65537四个字节的内存实际存放形式,(+65537)补 = 0000 0000 0000 0001 0000 0000 0000 0001,符号位,表示负,(-65537)补 = 1111 1111 1111 1110 1111 1111 1111 1111,真值为: -65537!,为什么-65537这个数在16位内存单元中的表示与在32位内存单元中的表示不相同呢?,这主要是因为-65537这个数超出了16位内存单元表示数的范围,所以实际存储的值(-1)与要表示的值(-65537)不同,但-32767并没有超出了32位内存单元表示数的范围,所以实际存储的值就是其本身。因此,我们在C语言中对数据处理时必须要注意数据的表示范围,以免引起不必要的错误。,2. 整数在内存中的表示,八进制整数,034: 对于16位的内存单元: 034 = (011 100)2,符号位,八进制数034两个字节的内存实际存放形式,(034)补 = 0000 0000 0001 1100,对于32位的内存单元: (034)补 = 0000 0000 0000 0000 0000 0000 0001 1100,八进制数034四个字节的内存实际存放形式,符号位,2. 整数在内存中的表示,八进制整数, 034: 对于16位的内存单元:,符号位,八进制数-034两个字节的内存实际存放形式,(+034)补 = 0000 0000 0001 1100,(-034)补 = 1111 1111 1110 0100,对于32位的内存单元: (+034)补 = 0000 0000 0000 0000 0000 0000 0001 1100,(-034)补 = 1111 1111 1111 1111 1111 1111 1110 0100,八进制数-034四个字节的内存实际存放形式,符号位,2. 整数在内存中的表示,十六进制整数,0X8AB6: 对于16位的内存单元: 0X8AB6=(1000 1010 1011 0110)2,符号位 表示负,十六进制数0X8AB6两个字节的内存实际存放形式,(0X8AB6)补 = 0 1000 1010 1011 0110,真值为:-30026 !,对于32位的内存单元: (0X8AB6)补 = 0000 0000 0000 0000 1000 1010 1011 0110,十六进制数0X8AB6四个字节的内存实际存放形式,符号位,真值为:+35510 !,溢出!,2. 整数在内存中的表示,十六进制整数,0X8AB6: 对于16位的内存单元:,(+0X8AB6)补 = 0 1000 1010 1011 0110,(-0X8AB6)补 = 1 0111 0101 0100 1010,十六进制数-0X8AB6两个字节的内存实际存放形式,符号位 表示正,真值为:+30026 !,对于32位的内存单元: (+0X8AB6)补 = 0000 0000 0000 0000 1000 1010 1011 0110,(-0X8AB6)补 = 1111 1111 1111 1111 0111 0101 0100 1010,十六进制数-0X8AB6四个字节的内存实际存放形式,符号位 表示负,真值为:-35510 !,3. 整型变量,整型变量的定义,int 变量名, 变量名2,变量名n;,int必须小写,至少一个空格,必须为合法的标识符,以逗号,分隔,以分号;结尾,定义时可以赋初值,方法:在变量名后面增加“= 数值”,例: int a; int x, y, z; int m = 2, y = -3;,当程序中定义了一个变量时,计算机会为这个变量分配一个相应大小的内存单元。因此,这个变量是有值的,它的值就是对应内存单元的值。如果定义时没有赋初值,则这个值程序员是无法预知的。,整型变量的分类,修饰符 控制变量是否有符号:signed(有符号)和unsigned(无符号) 控制整型变量的值域范围 :short(短)和long(长)。,有符号基本型(int) int a = -2; /定义一个有符号整型变量a,并赋初值-2 占一个机器字大小的内存单元。TC或BC3.1下,变量占2个字节(16位)的内存单元;VC6.0下,变量占4个字节(32位)的内存单元。,如果定义变量时,不指定signed,也不指定unsigned,则默认为signed(有符号),符号位,变量a占用的内存单元(2字节),有符号整型变量在内存中的实际存放形式(假设在BC3.1下),无符号基本型(unsigned int或unsigned),unsigned int a = 2; /定义一个无符号整型变量a,并赋初值2 或 unsigned a = 2; 占用的内存单元字节数同int类型。与int a = 2;等价。,unsigned int a = -2; /定义一个无符号整型变量a,并赋初值-2 或 unsigned a = -2;,无符号整型变量在内存中的实际存放形式(假设在BC3.1下),数据位,变量a占用的内存单元(2字节),其值为:65534 !,注意:对于有符号数也好还是无符号数也好,其实在计算机内存中表示是不加区分的,都是以其补码形式表示,只是我们怎样看待最高二进制位的问题,如果把最高位当成符号位看待,则为有符号数,如果把最高位当成数据位看待,则变为无符号数。 例如:unsigned int a = -2; printf(“%d”,a);-有符号输出,则为-2 printf(“%u”,a);-无符号输出,则为65534,有符号短整型(short int或short),short int a = 2; /定义一个有符号短整型变量a,并赋初值2 或 short a = 2; 占用的内存单元为2个字节,无论是TC、BC,还是VC。,无符号短整型(unsigned short int或unsigned short),unsigned short int a = 2; /定义一个无符号短整型变量a,并赋初值2 或 unsigned short a = 2; 占用的内存单元字节数同short类型。,在TC2.0和BC3.1下,unsigned short类型与unsigned int类型是等价的 。,有符号长整型(long int或long),long int a = 234567; /定义一个有符号长整型变量a,并赋初值234567 或 long a = 234567; 占用的内存单元为4个字节,无论是TC、BC,还是VC。,无符号长整型(unsigned long int或unsigned long),unsigned long int a = 2; /定义一个无符号长整型变量a,并赋初值2 或 unsigned long a = 2; 占用的内存单元字节数同long类型。,在VC中long与int类型基本相同,均占四个字节的内存单元;但在TC或BC中,long类型与int类型只是所占字节不同外(long占4字节,int占2字节),其它数据处理方法是一样的。,【例】各种整型变量的定义,#include #define SUM 65535 void main ( ) int a, b = 20; unsigned int c = 0xff; long D; a = SUM; D = 301; printf(“a = %dn“, a); printf(“b = %dn“, b); printf(“c = %dn“, c); printf(“D = %dn”, D); ,/文件包含,头文件说明,/定义符号常量SUM,值为65535,/定义两个int型变量a和b,b赋初值20,/定义无符号整型变量c,并赋初值0xff,/定义长整型变量D,/对a赋值为SUM,这时a的值是65535,/对D赋值为301,/以有符号十进制形式(“%d“)显示a的值,/以有符号十进制形式(“%d”)显示b的值,/以有符号十进制形式(“%d“)显示c的值,/以有符号十进制形式(“%d“)显示D的值,变量定义部分,语句执行部分,在TC2下运行结果: a = -1 b = 20 c = 255 D = 301,在VC6.0下运行结果: a = 65535 b = 20 c = 255 D = 301,对于16位的有符号整型变量a来说,因65535在内存中的形式为1111111111111111,最高位为1表示负,则其所对应的十进制数就为-1。,如果 usigned b=SUM; printf(“b=%u”,b); 结果会是?,4. 整数常量的分类,根据其值所在范围确定其数据类型。在TC2.0或BC3.1下,如果整型常量的值位于-3276832767之间,C语言认为它是int型常量;如果整型常量的值位于-21474836482147483647之间,C语言认为它是long型常量。 整型常量后加字母l或L,认为它是long int 型常量。比如123L、45l、0XAFL。 无符号数也可用后缀表示,整型常数的无符号数的后缀为U或u。例如:358u, 0x38Au,235Lu 均为无符号数。,前缀、后缀可同时使用以表示各种类型的数。如0XA5Lu表示十六进制无符号长整数A5,其十进制为165。其实整型常数这种表示无符号数意义不大,在机器内部它还是用其补码表示,例如-1U和-1在内存中表示是一样的,数据处理也一样,所以有的教科书上说“常量无unsigned类型”,其实有,但无意义。,5. 实型数据,实型常量(实数或浮点数),十进制小数形式:由数字09和小数点组成 . 如:0.0,5.6,-5. 指数形式:由十进制数,加阶码标志e或E以及阶码(只能为整数,可以带符号)组成. 其一般形式为:aEn 其中:a为十进制数,n为十进制整数,都不可缺少。其可表示为a10n,合法的实数表示: 2.1E5 表示2.1105,3.7E-2 表示3.710-2。,非法的实数表示: 345(无小数点) ,E7(阶码标志E之前无数字) , -5E(无阶码) ,50.-E3(负号位置不对),实型变量,单精度实型(float) float f = 3.14, g; 这种定义的变量在内存中占4个字节(32位)的存储单元。 双精度实型(double) double x, y; 这种定义的变量在内存中占8个字节(64位)的存储单元。 长双精度实型(long double) long double x, y; 在TC或BC下,这种定义的变量在内存中占10个字节(80位)的存储单元;在VC下则占8个字节(64位)。,注意: 三种实数类型中,其精度是 float double long double; long float实际上就是double,因此,没有long float类型; 所有的实型常量按照double类型处理。,5. 实型数据,实型数据的精度,#include void main ( ) float a; /定义float型变量a double b, c; /定义double型变量b和c a = 123.456789; /对变量a赋值为123.456789 b = a; /将变量a赋给变量b c = 123.456789; /对变量c赋值为123.456789 printf(“a = %f b = %lf c = %lfn“, a, b, c); ,123.456787,123.456787,123.456789,a = 123.456787 b = 123.456787 c = 123.456789,float型变量最多只能精确表示8个数字,因此显示a的值时,只能有效显示前面8个数字即123.45678,最后追加一位数字7是随机的,6. 字符型数据和字符串常量,字符型常量,定义:用单引号括起来的单个普通字符或转义字符.,如 a A ? n 101,字符常量的值:该字符的ASCII码值,如 A65, a97, 048 , n10,转义字符:反斜线后面跟一个字符或一个代码值表示,如 101 -A 012 -n 376 - x61 -a 60 -0 483 -(),例: 转义字符举例 #include void main ( ) printf (“101 x42 Cn“); printf (“I say:“How are you?“n“); printf (“C Programn“); printf (“Visual C“); ,运行结果:(屏幕显示) A B C I say:”How are you?” C Program Visual C,例: void main ( ) printf(“Yb=n”); ,运行结果: 屏幕显示:= 打印机输出:,字符串常量 定义:用双引号(“”)括起来的字符序列 存储:每个字符串尾自动加一个 0 作为字符串结束标志,例1: 字符串“HELLO”在内存中,例2: 空串 “”,0,字符常量与字符串常量不同,例: char ch; ch = “A”;,例: char ch; ch = A;,字符型变量 字符型数据类型符是char(字符character) 在内存中占1个字节(8位) 字符变量存放字符ASCII码 char与int数据间可进行算术运算 存在有符号和无符号之分。默认情况下为有符号,例: char ch; unsigned char C = B;,例: a = D; / a = 68; x = A + 5; / x = 65 + 5; s = ! + G / s = 33 + 71;,没有字符串变量,用字符数组存放,7. 简单数据类型的表示范围,符号位,十六位整型数所表示的数据范围,数据位,【例】变量的存储范围,#include void main ( ) char ch; int x; ch = 80 + 50; x = 80 + 50; printf (“ch = %dn“, ch); printf (“x = %dn“, x); ,ch = -126 x = 130,为什么?,十进制数 对应的机器数(补码) 80 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 ch + 50 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0,1 0 0 0 0 0 1 0,符号位,真值:-126,各位取反+1,0 1 1 1 1 1 1 0,=126,8. 简单的数据输出,C语言中没有用于输出的语句,只能通过标准库函数的调用来完成数据的输出任务。库函数的一般调用格式为:,函数名(参数1,参数2,参数n);,printf函数:,例: printf(“How are you!“);,输出: How are you!,例:int a = 100; printf(“variable a = %d“,a);,输出: variable a = 100,%d:用于显示有符号整型数据,如int、short型数据; %u:用于显示无符号整型数据,如unsigned int、unsigned short型数据; %f:用于显示实型数据,如float型数据; %c:用于显示字符型数据,如char型数据; %s:用于显示字符串数据。,格式控制符,例:简单的数据输出,#include void main ( ) int a, b; unsigned int u; long L; char ch; float f; a = 200; b = -1; u = b; L = u; ch = A; f = 32.17;,printf(“a = %dt“,a); printf(“b = %dn“,b); printf(“u = %ut“,u); printf(“L= %ldn“,L); printf(“f = %fn“,f); printf(“ch is %c and value is %dn“, ch, ch); printf(“I love C language!rYoun“); /I后有三个空格 ,在VC下: a = 200 b = -1 u = 4294967295 L = -1 f = 32.169998 ch is A and value is 65 You love C language!,在BC下: a = 200 b = -1 u = 65535 L = 65535 f = 32.169998 ch is A and value is 65 You love C language!,b的值是-1,在内存中表示为:0xffff(BC下),0xffffffff(VC下),当它赋给u时,由于u是无符号数,因此u的值是65535(BC下),4294967295(VC下)。,L是有符号长整型,u是无符号整型。在BC下,L占4字节,u占2字节,当把u赋值给L时,L的高2个字节为全0(因u无符号),故L的值为0x0000ffff,即65535。但在VC下, L和u都占4字节,当把u赋值给L时,L的值为0xffffffff,即-1。,前一讲小结,1. 标识符的定义、组成和限制,定义:用来标识变量、常量、函数等的字符序列,组成:只能由字母、数字、下划线组成, 限制: 第一个字母必须是字母或下划线 C语言的关键字不能用作变量名 大小写敏感 长度: 有效长度为32个字符。随系统而异,但至少前8个字符有效,2. 常量的定义与分类,定义:程序运行时其值不能改变的量(即常数),前一讲小结,常量的分类 : 直接常量( 值常量或称为字面产量) 整型常量: 10、15、-10、-30L、03、0X21、 实型常量: 12.5、 30.0、-1.5、3.2E-2 字符常量: A、b、c 字符串常量: “sum”、“A”、“123” 符号常量 用标识符来代表常量。,3. 变量 定义:程序运行时其值可以被改变的量 变量的三要素 :变量名 、数据类型、变量值 变量的定义格式 : 数据类型 变量名1,变量名2, ;,#define 符号常量名称 常量值,const 符号常量名称 = 常量值 ;,符号常量的定义形式,前一讲小结,4、整数的补码表示与存储格式 :,正整数或无符号整数的补码:就是其数的二进制表示。,负整数的补码: 就是把其绝对值转换成二进制,在对每一个二进制位都取反之后,再加1得到的二进制表现形式。,补码的符号扩展:就是高位部分全部按符号位填补。,例如:用两个字节存储-123的补码。,(123)10=(01111011)2 (-123)10补码=(10000101)2 即用一个字节来存储-123时,符号位是1; 如果用两个字节来存放它,则高位部分再扩展一个字节,且该字节各位的内容同符号位。 因此用两个字节存储-123的补码的形式如下: (-123)10补码=(1111111110000101)2,前一讲小结,5、数据类型的转换 :,(1)、将占用内存字节数较少的数据赋给占用字节数较多变量时,系统会自动扩展符号位来填充高位部分。 (2)、将占用内存字节数较多的数据赋给占用字节数较少变量时,系统会自动截断高位部分。此时会出现数据溢出或截断。,移码与补码的关系是符号位互为反码 即数据X的移码 =数据X的补码符号位取反,6、字符型常量与字符串常量的区别 :,7、特殊字符的表达方式(采用转义符) :,8、一个数的移码与其补码之间的关系,(1)、13为8进制数。 (2)、 X12为16进制数。,2.4 C语言的运算符与表达式,变量用来存放数据,运算符则用来处理数据。用运算符将变量和常量连接起来的符合C语法规则的式子被称为表达式。,运算符的分类: 单目运算符:只带一个操作数的运算符。如:+、-运算符。 双目运算符:带两个操作数的运算符。如:+、-运算符。 三目运算符:带三个操作数的运算符。如:?运算符。,学习运算符时应注意: 运算符的功能:该运算符主要用于做什么运算。 与运算量关系:要求运算量的个数及运算量的类型。 运算符的优先级:表达式中包含多个不同运算符时运算符运算的先后次序。 运算符的结合性:同级别运算符的运算顺序(指左结合性还是右结合性)。 运算结果的类型:表达式运算后最终所得到的值的类型。,1. 赋值运算符、赋值表达式,赋值运算符(“”,双目运算符),一般形式:,变量 = 常量或变量或表达式,功能:将右边常量或变量或表达式的值赋给左边变量,例如: int x, y, z; x = 20; y = x; z = x + y;,赋值表达式,定义:,由赋值运算符或复合赋值运算符(后面即将介绍),将一个变量和一个表达式连接起来的表达式,称为赋值表达式。,一般格式:,变量 (复合)赋值运算符 表达式,赋值表达式的值:被赋值变量的值。,例如:“a = 5”这个赋值表达式,变量a的值“”就是它的值。,赋值语句,例如: x = 8; a = b = c = 5;,定义:赋值表达式在其后面加分号就构成了赋值语句。,赋值运算符及赋值表达式的使用,多个变量连续赋值,例如: a = b = c = 10;,a = (b = (c = 10);,结果:a、b、c的值都为10,赋值表达式的嵌套,例如: a = (b = 2) + (c = 3),( a = (b = 2) + (c = 3),结果:b为2,c为3,a为b+c即5,注意: 赋值语句“=”左边必须是变量名或对应某特定内存单元的表达式(后面的章节会遇到这样的表达式),不能是常量或其它表达式。 例如:30 = a; b + 2 = 5; 都是错误的。 赋值语句中的“=”表示赋值,不是代数中相等的意思。要表示相等的意思则应用关系运算符“= =”表示,二者切勿混淆!,2. 数据类型转换,C语言的数据类型是可以相互转换的。转换的方法有两种:一种是自动转换,一种是强制转换。,自动转换,例如:int a = 2.5; 则a的值将是2,而不是2.5。 这种自动改变等号右边表达式值的数据类型的操作称为数据类型的自动转换。,首先将等号右边的表达式的值转换成“=”左边的数据类型。然后再赋值给等号左边的变量。,(1) 短长度的数据类型 长长度的数据类型,方法:直接将无符号短长度的数据类型的数据作为长长度的数据类型数据的低位部分,长长度的数据类型数据的高位部分补零。,无符号短长度的数据类型 无符号或有符号长长度的数据类型,xxx,无符号短长度的数据类型,0,0,.,.,.,.,.,0,.,.,.,.,.,高位部分补0,例如: unsigned char ch = 0xfc; unsigned int a = 0xff00; /假设int数据为16位 int b; unsigned long u; b = ch; /b的值将是0x00fc u = a; /u的值将是0x0000ff00,如果将ch的值赋给-4,问b的值又是多少呢?,0x00fc,2.数据类型转换,自动转换,(1) 短长度的数据类型 长长度的数据类型,方法:直接将有符号短长度的数据类型的数据作为长长度的数据类型数据的低位部分,然后将低位部分的最高位(即有符号短长度数据的符号位)向长长度的数据类型数据的高位部分扩展。,有符号短长度的数据类型 无符号或有符号长长度的数据类型,zxx,有符号短长度的数据类型,z,符号位向高位部分扩展,z,z,符号位,例如: char ch = 2; int a = -2; int b; unsigned long u; b = ch; /b的值将是2 u = a; /u的值将是0xfffffffe,2.数据类型转换,自动转换,(2) 长长度的数据类型 短长度的数据类型,方法:直接截取长长度的数据类型数据的低位部分(长度为短长度的数据类型的长度)作为短长度数据类型的数据。,例如: int a = -32768; /假设int数据为16位 unsigned long b = 0xffffaa00; char ch; int c; ch = a; /ch的值将是0 c = b; /c的值将是0xaa00,(3) 长度相同的数据类型转换,方法:数据按照原样复制即可。,例如: int a = 0xff00; unsigned int b = a; /b的值将是0xff00,2.数据类型转换,强制转换,强制类型转换是通过类型转换运算来实现的。其一般形式为:,(类型说明符) (表达式),功能:把表达式的运算结果强制转换成类型说明符所表示的类型。其中,(类型说明符)是强制类型转换符,它的优先级比较高。,例: float x = 3.5, y = 2.1, z; int a; a = (int)(x+y); /结果为5 z = (int)x+y; /结果为5.100000 z = (double)(3/2); /结果为1.000000 a = (int)3.6; /结果为3,精度损失问题,注意:在使用强制转换时应注意以下问题: 类型说明符和表达式都必须加括号(单个变量可以不加括号)。 例如:把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。 例如,(double)a 只是将变量a的值转换成一个double型的中间量,其数据类型并未转换成double型。,基本算术运算符: + - * / % 结合方向:从左向右 优先级: - -* / % - + - (2) (3) (4) 说明: “-”可为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据,例: 5 / 2结果 -5 / 2.0结果,例: 5 % 2 结果 -5 % 2结果 1 % 10结果 5 % 1结果 5.5 % 2,3. 算术运算符、算术表达式,2,-2.5,1,-1,1,0,(),余数的符号与被除数的符号相同, 其值的绝对值等于两数绝对值相 除所得的余数。,表达式和算术表达式,3. 算术运算符、算术表达式,表达式:用运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合语言语法规则的式子。 算术表达式:表达式中的运算符都是算术运算符的表达式。,运算符优先级(到目前为止),例: 3 + 5 * 8、(x + y) / 2 - 1等,高,低,自增、自减运算符+ - 作用:使变量值加1或减1 种类: 前置 +i, -i (先执行i=i+1或i=i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i=i+1或i=i-1),例: j = 3; k = +j; j = 3; k = j+; j = 3; printf (“%d”, +j); j = 3; printf(“%d”, j+); a = 3; b = 5; c = (+a) * b; a = 3; b = 5; c = (a+) * b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,4. 自增自减运算符、符号运算符,负号运算符(“-”) 减号()既是一个算术运算符,又是一个负号运算符。负号运算符是单目运算符。例如:a = 2,那么a的值就是2。负号运算符的优先级比较高,与强制类型转换符是同一个级别。,自增、自减运算符注意事项 +和-运算符只能用于变量,不能用于常量和表达式。 因为+和-蕴含着赋值操作。 例如:5+、-(a+b)都是非法的表达式。 负号运算符、+、-和强制类型转换运算符的优先级相同,当这些运算符连用时,按照从右向左的顺序计算,即具有右结合性。 两个和之间不能有空格。 在表达式中,连续使同一变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。 例如:+i+是非法的。 自增、自减运算,常用于循环语句中,使循环控制变变量加(或减)-,以及指针变量中,使指针指向下(或上)一个地址。,4. 自增自减运算符、符号运算符,例: int p, i = 2, j = 3; p = -i+; p = ? i = ? p = i+j; p = ? i = ? j = ? p = i+-j; p = ? i = ? j = ? p = i+-j; p = ? i = ? j = ? p = i+i+; p = ? i = ? p = +i+(+i); p = ? i = ? p=+i+i+; p = ? i = ?,-2,3,5,3,3,4,2,2,4,3,2,4,4,4,8,4,6,5. 算术运算符中数据类型转换规则,#include void main ( ) float a, b, c; a = 7 / 2; /计算7/2得int型值3,因此a的值为3.0 b = 7 / 2 * 1.0; /计算7/2得int型值3,再与1.0相乘,因此b的值为3.0 c = 1.0 * 7 / 2; /先计算1.0*7得double型的结果7.0,然后再计算 7.0/2,因此c的值是3.5 printf (“a = %f, b = %f, c = %f“, a, b, c); ,a = 3.000000,b = 3.000000,c = 3.500000,6.关系运算符、逻辑运算符、条件运算符,1. 关系运算符和关系表达式,关系运算符,关系表达式,用关系运算符连接起来的式子称为关系表达式。 关系表达式的一般形式为:表达式 关系运算符 表达式,例:a + b c d x 3 / 2 a + 1 c i 5 * j = k + 1,注意: C语言用0表示假,非0表示真。 一个关系表达式的值不是0就是1,0表示假,1表示真。,关系运算符的优先级,例如: c a + b 等价于: a b != c 等价于: a = b c 等价于: a 2 b | c 等价于:,c (a + b),(a b) != c,a = (b c),a = (b c),(a 2) (c + d),(a & (4 b) | c,已知:a = 1; b = 2; c = 3; 问:d = a != c = a b c;的值?,答:d 的值为1。 等价于:d = (a != c) = (a b) c);,例:int a = 3, b = 2, c = 1, d, f; a b (a b) = c b + c b f = a b c,/表达式值1,/表达式值1,/表达式值0,/d = 1,/f = 0,关系运算注意:,例 若a = 0; b = 0.5; x = 0.3; 则 a = x = b的值为,0,例 5 2 7 8在C中是 允许的,值为,0,例 int i = 1, j = 7, a; a = i + (j % 4 != 0); 则a =,2,例 a0 结果为 A100 结果为,1,0,例 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0=1.0 结果为 可改写为:fabs(1.0/3.0*3.0-1.0)1e-6,0,2. 逻辑运算符和逻辑表达式,逻辑运算符,逻辑运算真值表,例如: a b & x y 等价于: a = b | x = y 等价于: !a | a b 等价于: !a b 等价于: c = a | b 等价于: a | 7 & b & 8 等价于: a 2 & b 1 等价于:,2. 逻辑运算符和逻辑表达式,逻辑表达式,用逻辑运算符连接起来的式子称为逻辑表达式。 逻辑表达式的一般形式为:表达式 逻辑运算符 表达式,例:a 10 | x -10、!x & !y,逻辑运算符的优先级,(a = x) & (x = b),(a b) & (x y),(a = b) | (x = y),(!a) | (a b),(!a) b,c = (a | b),(a | 7) & (b & 8),(a 2) & (b 1),已知:a = 4; b = 5; 问:c = b 3 的值?,答:c 的值为1。 等价于:c = (b 3) ,例: a = 4; b = 5; !a a & b a | b !a | b 4 & 0 | 2 5 3 & 2 | 8 4 - !0 c & d,/值为0,/值为1,/值为1,/值为1,/值为1,/值为1,/值为1,逻辑运算注意:,逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025劳务合同非事业编制人员劳务合同书
- 2025股权投资合同范本 适用于企业投资协议
- 广西壮族自治区百色市2023−2024学年高一下册7月期末教学质量调研测试数学试卷附解析
- 广东省佛山市七校联考2023−2024学年高二下册联考数学试卷附解析
- 2024~2025学年 浙江省宁波市高一语文上册12月月考试卷附答案
- 粮食委托采购协议书
- 社区大数据与社区治理基础知识点归纳
- 2025年自学考试java程序设计试题
- 高一年级地理学科大气圈与天气气候12课时教学设计
- 第三组教学设计(修复的)
- 昆明理工大学《物理化学(Ⅱ)》2023-2024学年第一学期期末试卷
- 【MOOC】数字电子技术-中南大学 中国大学慕课MOOC答案
- 交通管理扣留车辆拖移保管 投标方案(技术方案)
- 医院健康咨询合同范本
- 中国血管性认知障碍诊治指南(2024版)解读 课件
- 2024年“安全生产月”暨“安康杯”竞赛活动考试题库及答案
- 临床提高脓毒性休克患者1h集束化措施落实率PDCA品管圈
- 初一英语阅读理解100篇七年级上册英语阅读理解及答案
- 急性肺栓塞的急救护理
- 四川省攀枝花市(2024年-2025年小学五年级语文)部编版期末考试(下学期)试卷及答案
- 奶茶供货合作协议书范文范本
评论
0/150
提交评论