C语言第2章基本数据类型.ppt_第1页
C语言第2章基本数据类型.ppt_第2页
C语言第2章基本数据类型.ppt_第3页
C语言第2章基本数据类型.ppt_第4页
C语言第2章基本数据类型.ppt_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章 基本数据类型,兰州理工大学,第二章 基本数据类型,2.1 数据类型 2.2 保留字、标识符 2.3 基本数据类型 2.4 运算符与表达式 2.5 类型之间的关系 2.6 位运算 2.7 数组和指针 2.8 简单应用程序举例,2.1 数据类型,2.1 数据类型,不同类型的数据代表不同的: 数据表示形式; 合法的取值范围; 占用内存空间大小; 可参与的运算种类。 “先声明、后使用”原则:即使用一个数据前必须先声明其类型,使编译器生成目标代码时知道需要分配多大的存储空间及如何引用它。 一些数据类型之间有密切的关系,称为相容,一些数据类型之间还可以进行(自动的或强制的)类型转换。,2.1 数据类型,单精度实型 (float),双精度实型 (double),整型 (int),字符型 (char),枚举类型,数组类型,结构体类型,共用体类型,实型,基本类型,构造类型,空类型 (void),指针类型,数据类型,2.2 保留字、标识符,2.2.1 单词,组成语言程序的最小词法单位是单词(Token),即单词是语言中具有独立意义、不可拆分的最基本单位。 语言程序中有以下几种单词:,2.2.1 单词,保留字(Reserved Word),亦称关键字(Key Word) C语言中预先规定的具有固定含义的一些单词 如:数据类型修饰符int,控制语句return等。 标识符(Identifier):即名字 系统预定义标识符,main, printf 等; 用户自定义标识符,Add, x, y 等。 运算符(Operator):34种; 分隔符(Separator):空格、回车/换行、逗号等 其它符号 :大花括号“ ”用于标识函数体或语句块 ,“/* */”是程序注释所需的定界符; 数据(Data) 变量(Variable) 常量(Constant),2.2.2 标识符,由字母或下划线开头的字母、数字和下划线组成的字串; 用以命名常量及变量名、函数名、自定义类型名、语句标号等; 大小写敏感:count、COUNT和Count被认为是三个不同的标识符。 以下标识符是非法的: 3s 以数字开头 s*T 出现非法字符* -3x 以减号开头 bowy-1 出现非法字符-(减号),2.2.3 保留字,保留字或关键字:预先规定的具有固定含义的一些单词。 关键字都是小写的,不同编译器可能略有不同。 Turbo C扩充了11个关键字: asm、_cs、_ds、_es 、_ss 、cdecl、far huge interrupt near pascal 以下7个用在预处理命令中的标识符,也看作是关键字: define, include, undef, ifdef, ifndef, endif, line,2.2.4 选择合适的标识符,不允许使用关键字作为标识符: int, float, for, while, if等 不可以是数字开头; 命名应直观,见名知意,便于记忆和阅读 最好使用英文单词或其组合 下划线和大小写通常用来增强可读性 variablename variable_name VariableName 可以为任意长度,但一般只识别前31个字符; 某些功能的变量采用习惯命名 如:for语句所采用的循环变量习惯用i, j, k,Windows 风格,UNIX 风格,2.2.5 常量与变量,在程序的执行过程中: 值不能被改变的量称为常量(Constant)。 值可以改变的量称为变量(Variable)。 无论是常量还是变量,都有其类型,并且根据所属类型具有其可进行的运算。,2.2.5 常量与变量,1常量和符号常量 常量根据书写形式(语法形式)决定其类型(即常量可以不经说明而直接引用) 。如: 800、1500是整数类型, 800.00、3.14159是浮点类型, a、b是字符类型。 符号常量是用标识符(或宏替换名)表示的特殊的常量。如: 圆周率可表示为: const /*float*/ pi = 3.14; #define PI 3.14 如果要提高精度,只要修改pi(PI)的初始值就可以了(如将3.14改成3.1415926)。 好处:含义清楚;“一改全改”。,2.2.5 常量与变量,2变量 变量有四个部分组成: 变量名、 数据类型、 内存地址、 变量的值。 变量用标识符命名,它对应着内存中的某个存储区域,该区域的位置由内存地址指明,区域中可存放数据。通过变量的名字访问存放在这个存储区域中的数值。 “先声明、后使用”原则:“声明”即对程序中所用的变量类型必须由程序员进行显式声明。 声明方式: type 变量表; 例: int a = 2; int I, j, k; float b = 1.0e-5; char c =n;,type可以是:int、float、double、char等。,变量表可以是: 一个或多个同类型变量; 其中可以赋值。 一行可有多个语句;,2.2.5 常量与变量,2变量 声明变量的语句称为声明语句或变量声明语句。 声明变量告诉编译器变量的名字及其类型,以便编译器给变量分配相应的存储空间,并不执行。 变量的值主要通过赋值(Assignment)运算改变: 赋值运算由赋值运算符“=”将赋值表达式分为左、右两边, 左边一般是变量名(不能是常量),称为左值; 右边是一个可以具体计算的表达式,称为右值。 赋值语句将右值求出并放入左值的存储区域中。例: int i; i = 3 * 8;,2.2.5 常量与变量,2变量 例:int a = 3;,a,2000H,2001H,变量名,内存地址,变量的值,两个字节,整形数, 低字节在前,高字节在后,将变量名映射到内存地址 (即将a映射为2000H),2.3 基本数据类型,2.3 基本数据类型,语言提供5种基本数据类型:,基本数据类型,整型 int,浮点(实)型 float,字符型 char,双精度(实)型 double,基本整型,长整型,短整型,无符号整型,空值型 void (无值型),2.3 基本数据类型,除了基本类型外,语言还提供: 构造类型,包括: 数组、 结构(体)、 联合(共用体)、 位域。 枚举类型; 指针类型。 此外,C语言还允许用户使用typedef关键字产生自定义类型。,2.3 基本数据类型,不同类型数据的存储方式和取值范围与计算机硬件(主要是字长)结构密切相关。,2.3 基本数据类型,除空值类型外,其余四种基本类型前面还可加上类型修饰符,用于改变基本数据类型的含义。 类型修饰符有两对: signed(有符号)和unsigned(无符号)、 short(短)和long(长)。 这两对修饰符可同时用于修饰基本数据类型,但同一对中只允许出现一个修饰符。,2.3 基本数据类型,表2.2列出了基本数据类型和类型修饰符的所有组合方式。,2.2.3 保留字,例: #include main() printf(“Data type Number of bytesn“); printf(“- -n“); printf(“char %dn“, sizeof(char); printf(“int %dn“, sizeof(int); printf(“short int %dn“, sizeof(short); printf(“long int %dn“, sizeof(long); printf(“float %dn“, sizeof(float); printf(“double %dn“, sizeof(double); printf(“long double %dn“, sizeof(long double); ,2.3.1 数据的内部表示,在语言中: 整型数一般采用补码形式表示, 实数采用浮点小数表示。 例1:int i = -10; 求-10的补码: 10的原码: 取反: 再加1,得-10的补码: 整数有三种: 位的字符整数; 16位的整数(短整数); 32位的长整数。,2.3.1 数据的内部表示,有三种不同尺寸的浮点类型: 字节(单精度)浮点数、 字节双精度数 10字节长双精度数。 都使用四部分位组来确定所表示的数值 数符和阶符各占一位,阶码的位数决定了数据的大小范围,尾数的位数规定该数据有效位长度。,2.3.2 字符类型,字符类型的数据在内部存储的是该字符的ASCII码,即存储的是一个整型数值。 字符类型包括: 字符常量; 字符变量。,2.3.2 字符类型,1. 字符常量 括在单引号中的字符称为字符常量。 如:A、9、 (空格)、_(下划线)等。 字母的大、小写是不同的,即A和a 不同。 单引号左右两边的单引号是相同的(分号右边的键)。 转义字符:意即转变其他字符的含义来表示特殊字符。 转义字符也由单引号括住,以反斜线“”开头。,2.3.2 字符类型,2. 字符变量 类型声明: char choice; 声明的同时可以赋值: char choice = Y; 以下三条声明语句都与上一条语句等价: char choice = 131;/ 八进制 char choice = x59;/ 十六进制 char choice = 89; / 十进制 一次可以声明多个变量,例如: unsigned char sel1,sel2;,2.3.2 字符类型,【例2.1】字符变量声明和赋值举例。 /* character example_1 */ main() char c1=89, c2, c3, t=t; c2=130; c3=x5a; printf(“%o%c%x%c%d%c%cn“, c1, t, c1, t, c1, t, c1); printf(“%ot%xt%dt%cn“, c2, c2, c2, c2); printf(“%ot%xt%dt%cn“, c3, c3, c3, c3); ,2.3.3 整数类型,1. 整数常量 整数常量支持三种数制:十进制、八进制和十六进制。 【例2.2】同一整数数值的3种表示(输入)方法: 十进制 八进制 十六进制 0 0 0x0 7 07 0x7 9 011 0x09 83 0123 0x53 123 0173 0x7B 123与0123表示的是不同的数值。,2.3.3 整数类型,1. 整数常量 整数常量(不加说明时)的类型由整数值所属的范围决定,编译其会将其类型解释为能存储该数的最小类型。例如: 123是有符号整数类型, 50000可解释为无符号整数类型, 而5500000则应解释为有符号长整数类型。 整数常量后可加后缀,以显式指明其类型,后缀有两种: u|U 无符号后缀 l |L 长后缀 例如:023,234l,33u,0x24,25,067,0xa9,10L 都是C语言允许的整型常量。,2.3.3 整数类型,2. 整数变量 声明 类型修饰符 int 变量表; 例如: int age, work_years; /两个整型变量 long int population; /长整型变量 short days=7;/短整型变量并赋初值为7,2.3.3 整数类型,【例2.3】整型变量的定义和赋值举例 /*integer number example*/ main() int x,y,z,t; x = 32768u; y = 011L; z = 0x23; t = t; printf(“%o%c%x%c%u%c%dn“,x,t,x,t,x,t,x); printf(“%o%c%x%c%u%c%dn“,y,t,y,t,y,t,y); printf(“%o%c%x%c%u%c%dn“,z,t,z,t,z,t,z); ,2.3.4 浮点类型和双精度类型,1. 浮点(实型)常量 普通十进制数,例如: 3.14159 +33.3 -4.275 2. .025 -.5 科学记数法,例如: 9.10956E-28 18E10 2e-5 -27e4 浮点常量不加说明时其类型为双精度类型,占8个字节。 浮点常量也可加后缀,后缀有两种: f |F浮点后缀 l |L 长后缀 下列都是C允许的浮点常量,如: -0.003,3e+5,.234e-2,3.14L,6.78f等。,2.3.4 浮点类型和双精度类型,2. 浮点变量与双精度变量 声明 类型修饰符 float 变量表; 类型修饰符 double 变量表; 例如: float balance; /浮点变量 double weight=0;/双精度变量并赋初值0 long double distance;/长双精度变量,2.3.4 浮点类型和双精度类型,【例2.4】实型变量的声明和打印举例 /* float number example */ main() float x,y,z; x=100l; y=2.3456f; z=88.9L; printf(“%5.1f n“,x); printf(“%5.1f n“,y); printf(“%5.1f n“,z); printf(“%dn”,sizeof 88.9L); /* 88.9L的字节数 */ printf(“%dn“,sizeof(2.3f); /* 2.3f的字节数 */ printf(“%dn“,sizeof(y); /* y的字节数 */ ,2.3.5 字符串常量,字符串常量是括在双引号内的字符序列。 字符串中可以包含空格、转义字符以及中文。如: “This is a string constant.“ “His name is “John“.n“ “注意:x07n张三正在开会。n“ 要注意字符串中转义字符的用法,例如: “Hi,x7come on. “被解释为:“Hi,|ome on.“ 字符串中的字符个数称为字符串的长度(转义字符只当作一个字符计算)。 字符串存储时,除串中的字符外,还在最后接一个0 字符(空字符)表示串的结束,所以长度为n的字符串需要n1个字节来存储。 “A”与A不同,前者是字符串常量,占两个字节;后者是字符常量,占一个字节。 语言用数组存放字符串,故字符数组与字符串等价。,2.3.6 符号常量,采用存取修饰符const声明符号常量,称为const常量。 声明语句中需对符号常量初始化。如: const float pi = 3.14159; const int model = 486;,2.4 运算符与表达式,2.4 运算符与表达式,数据类型不仅限定了常量与变量的存储方式、取值范围,还约束了数据可进行的操作。 对常量与变量进行加工的过程称为运算。 表示各种不同运算的符号称为运算符。 参与运算的数据称为操作数。 程序的基本运算主要由表达式完成,既灵活又复杂。,2.4 运算符与表达式,语言的基本运算包括: 算术运算、 关系运算、 逻辑运算、 位运算、 赋值运算 逗号运算等。 按操作数的个数,运算符可分为: 一元(单目)运算符、 二元(双目)运算符、 三元(三目)运算符。,2.4.1 表达式,表达式(Expression)是由操作数和运算符按一定语法形式组成的符号序列。 每个表达式经过运算(求值)后都会产生一个确定的值,称为表达式的值。 表达式的值具有某种类型,即为表达式的类型(包括空值类型)。 一个常量或变量是最简单的表达式,其值即是该常量或变量的值; 表达式的值还可以用作其他运算的操作数; 圆括号括住的表达式还是一个表达式,其值和类型与未加括号时相同。 以下均是合法表达式: 3.14 、 balance 、 2 * r * pi a * (b + c) + d,2.4.1 表达式,C 运 算 符,算术运算符:(+ - * / % + -) 关系运算符:( = !=) 逻辑运算符:(! & |) 位运算符 :( | &) 赋值运算符:(= 及其扩展) 条件运算符:( ? : ) 逗号运算符:(,) 指针运算符:(* &) 求字节数 :(sizeof) 强制类型转换:(类型) 分量运算符:(. -) 下标运算符:() 其 它:(( ) -),2.4.2 算术运算符及算术表达式,1算术运算符 算术运算符有:+、-、*、/、%、+、-。其中: 一元运算符:“-”,取操作数的相反数。 二元运算符:+、-、*、/、%: “%”、“+”、“-” 只可用于整数类型; 其他运算符可用于整型、浮点型和双精度型。 “/”:若两个操作数都是整型,即为整除。其结果舍弃小数,取整。例如: 15/3、16/3与17/3的求值结果均为5, 而1/3和2/3的求值结果均为0。 “%”:取模,即只取余数。例如: 173的求值结果为2, 28%5的求值结果为3。 取模的结果不可能大于或等于第二个操作数。,2.4.2 算术运算符及算术表达式,1算术运算符 “+”为自增运算符, “-”为自减运算符。 可以前置也可以后置。如: a+ (后置),或 +a (前置); +在前则先加1,再参加运算; +在后则先参加运算,后加1。 例: main() int a=3;int b=2; int c; c=a+*b; printf(“%dn“,c); a=3;b=2; c=+a*b; printf(“%dn“,c); ,2.4.2 算术运算符及算术表达式,1算术运算符 不同的编译系统对printf函数的输出表列中的求值顺序不一定相同,可以从左到右,也可从右到左。 main() int i=8; printf ( “%dn%dn%dn%dn%dn%dn“, +i,-i,i+,i-,-i+,-i-); ,Turbo C 从右到左,?,VC+6 的结果,2.4.2 算术运算符及算术表达式,2算术表达式 有算术运算符参与运算的表达式称为算术表达式。 参加算术表达式的操作数可以是字符类型、整数类型、浮点类型、双精度类型等多种,算术表达式的求值结果也可以是这些类型。例如: x * (y - z) (a - 2) / (b + 2) + 50 均是算术表达式。,2.4.2 算术运算符及算术表达式,3重要说明 溢出:程序设计中,会产生各种运算溢出,均会产生一个错误的结果或导致程序终止(且因编译器而异)。 例: main() int a,b; a=32767; b=a+1; printf(“ %d n %d“,a,b); ,2.4.2 算术运算符及算术表达式,3重要说明 操作数的不同类型会使相同表达式的值产生不同的内部表示(也因编译器而异) 。 如:若x是短整数,x=3;表达式x/2,当x为有符号数时,结果为1,若x为无符号数,结果为32766。 例: main() short int x=-3; printf(“ %dn“,x/2); ,main() unsigned int x=-3; printf(“n %dn“,x/2); ,2.4.2 算术运算符及算术表达式,4算术赋值运算 C语言提供了更简单的方式将算术运算与赋值表达式结合在一起,如: x = x+y 可表示为 x += y x = x-y 可表示为 x -= y x = x*y 可表示为 x *= y x = x/y 可表示为 x /= y x = x%y 可表示为 x %= y x = x+1 可表示为 x+=1,或 x+ x = x-1 可表示为 x-=1,或 x- 这不仅简化了表达式的写法,更重要的是提高了编译程序实现的效率。,2.4.3 关系运算符及关系运算表达式,1关系运算符 关系运算符全部是二元运算符,包括有: 大于 = 大于或等于 = 等于 != 不等于 关系运算的结果是整数类型int。 若比较关系成立,则结果(亦称返回值)为1(布尔值true),否则为0(布尔值false)。如: 1327的求值结果为0, 13=21的求值结果为1。 注意:C语言没有布尔类型,而用0表示false,非0则为true。,2.4.3 关系运算符及关系运算表达式,2关系表达式 两个表达式通过关系运算符可组成一个新的表达式,称为关系表达式。 参加关系表达式的操作数可以是字符类型、整数类型、浮点类型、双精度类型等多种,但关系表达式的求值结果只能为1(表示真)或0(表示假)。如: x = (y-z) a != b+1 均是关系表达式。,2.4.4 逻辑运算符及逻辑表达式,1逻辑运算符 逻辑运算亦称布尔运算。逻辑运算符主要包括: &(与) |(或) (异或) !(非)等。 其中:!是一元运算符,其余是二元运算符。 语言没有布尔类型,表示逻辑真与逻辑假的方法是只要其值不为0则当作真。 2逻辑表达式 逻辑表达式的操作数可以是字符类型、整数类型,结果为1或0。如:判断闰年的逻辑表达式: (year %4 = 0 & year %100 !=0) | year %400 = 0 如上式值为1,则是闰年,否则不是。,2.4.5 赋值表达式,赋值语句本身也是表达式,称为赋值表达式。 赋值表达式的(返回值)类型是赋值语句左边的类型,整个赋值表达式的求值结果也是赋值后左边的值,如: x = y + 1 是一个赋值表达式。赋值表达式的值还可作为一个值使用,所以 z = x = y + 1 也是一个赋值表达式。 而 z + (x = y + 1) 则是一个算术表达式。我们不提倡这种简化的连续写法,在许多情况下它使程序变得难以理解。,2.4.6 逗号表达式,由逗号分开的表达式序列,称为逗号表达式。 其求值次序是从左到右依次求值。 逗号表达式返回最后一个表达式的值。如:下式 balance += amount,balance max_balance 则返回balance max_balance的值。 【例2.5】 逗号表达式用法举例 main() int balance, amount, max_balance; balance=10; amount=20; max_balance=30; balance =(balance += amount,balance max_balance ); printf(“%dn“,balance ); /*打印的结果为0*/ ,2.4.7 表达式的运算顺序,有多个运算符的表达式先进行哪一个运算? 通常先计算(最里层)括号(圆括号)内的表达式,再计算(外层及)括号外的表达式,如: a + (b + c) * d) 的求值次序是先求bc,其结果再与d相乘,最后再加上a。 编程语言引入运算符优先级与结合性质的概念。 即运算符的3个基本属性: 功能(含义); 优先级; 结合性。,2.4.7 表达式的运算顺序,优先级与结合性质因编译器而异。 通常满足先乘除、后加减且从左到右进行计算。如表达式: a + (b + c) * d 与 a + (b + c) * d) 的求值结果是相同的。 表达式除了求值之外,还可能产生“副作用”(Side Effects)。即指表达式求值之外的任何其他动作。如:赋值表达式会修改一个变量的值。,2.4.8 条件运算,三元运算符 “ ? :”即条件运算符: e1 ? e2 : e3 ; 计算时,首先对e1求值,如果结果不为0,则对e2求值,并将e2的求值结果作为整个表达式的值(不对e3求值),否则对e3求值,并将e3的求值结果作为整个表达式的值(不对e2求值)。如: (amount = balance) ? amount : 0; 若amount的值不超过balance的值,则整个表达式的值为amount的值,否则整个表达式的值为0。 条件运算还可嵌套使用,如: (amount = 0) ? 0 :(amount 0 ? 1 :1); 但条件运算嵌套层次太深时,难以阅读和理解。 使用条件运算更加简洁、方便。,2.4.9 sizeof运算,sizeof运算返回操作数所占存储空间的字节数。大小,结果的类型是unsigned。 sizeof运算有两种形式: sizeof ; sizeof (); 同种类型在不同的平台其占字节数不尽相同。比如int在16位、32位和64位系统分别占2、4和8个字节。故应该用,并且只用sizeof获得字长。 例如前。,2.4.10 运算符优先级与结合性质,结合性质:同一优先级的运算按结合性质从左到右 (称为左结合)或从右到左(称为右结合)运算。 部分运算符优先级与结合性质如表2.5所示,表中按运算符优先级排序,同一行中运算符优先级相同。 按表中的规定,下列表达式有唯一的求值次序: 表达式 求值次序 abc (a b) c ab*c a (b * c) a=b|c a = (b | c) abc&d=e (a b) c) & (d = = e) is_over?x=0:x=1 (is_over ? (x=0) : x) = 1 复杂表达式难以理解并容易产生错误。 程序员应该养成一种良好的习惯:尽量使用括号消除表达式中求值的二义性。,2.4.10 运算符优先级与结合性质,表 2.5 语言的运算符优先级与结合性质,2.5 类型之间的关系,2.5.1 隐式类型转换,当表达式中存在不同类型的操作数时,编译器自动对部分操作数进行类型转换使其一致,称为隐式(或自动)类型转换。如: int age; 要计算 age * 1.50 此时, “*”左边是int类型、右边是double类型,编译器首先将age转换为double类型,然后求值,其结果也为double类型。 这种类型转换并不改变age本身的类型。,2.5.1 隐式类型转换,隐式类型转换规则: 除unsigned short外,所有char、short类型的数据无条件转换为int类型。 如果一个二元运算符两边操作数的类型不一致,则将取值范围较小的类型转换为取值范围较大的类型,求值结果也是取值范围较大的类型。 取值范围从大到小分别是: 大 long double double float 转 unsigned long long 换 unsigned 小 int 其目的是在转换过程中尽量不丢失信息。,2.5.1 隐式类型转换,注意对于赋值运算,语言规定: 当赋值表达式左、右两边操作数的类型不一致时,右操作数首先转换为左操作数的类型,然后将结果赋值给左操作数,整个赋值表达式的结果类型是左操作数的类型。 显然,这种转换过程常常会丢失部分数据。 由于隐式类型转换不反映在程序文本中,丢失部分数据后又不会报错,所以我们要特别小心不同类型的数据在一起的混合运算。 建议:尽量避免隐式类型转换而使用显式的强制类型转换。,2.5.2 强制类型转换,强制类型转换具有最高优先级。 强制类型转换的形式是: (类型名)表达式 例如:矩形面积为20,长为8,求其宽度。语句 printf(“Width is: %dn“, 20/8); 为整型除法,结果是2,误差很大。 若强制转换为浮点类型,使用以下语句均可: printf(“Width is: %fn“, (float)20/8); printf(“Width is: %fn“, 20/(float)8); 输出结果都是2.5。 但以下语句运算后才作强制转换,输出还是2: printf(“Width is: %fn“, (float)(20/8);,2.6 位运算,2.6 位运算,位运算主要用于较低层的程序设计。 位运算是对字节或字中的二进制位(bit)进行检测、设置或移位。 位运算的操作数主要是char与int类型及其变体。不能用于float、double、void等更复杂的类型。 将位运算的操作数看作是二进制数或十六进制数更容易理解。 C语言一共提供了6种位运算: 位求反 & 位与 | 位或 位异或 右移,2.6 位运算,(1)“ ”是一元运算符,是对操作数中的二进制数逐位求反,即值为0的位变成1,值为1的位变成0。显然对于任意数x,都有(x)=x。例如0x4A对应的二进制字节为01001010,求反结果为10110101,即0xB5。,2.6 位运算,(2)“&”将两个操作数的对应位作与运算。两个操作数对应的位均为1时,运算结果为1,否则为0。例如0x5A&0xB7(即01011010与10110111逐位求逻辑与)结果为0x12(即00010010)。“&”的典型用法是用来取出标志字中某一位,例如一个标志字节flag的每一位都对应设备的某种状态,如果需要取出左起第三位的状态,只要用00100000(即0x20)与flag进行位与运算,然后判断运算结果是否为0即可。如果该状态为0,则关系运算“(flag&0x20)= =0”的值为1,否则值为0。位与的另一种典型用法是用来设置标志字中的某一位为0,例如我们想要设置flag左起字节的第三位的值为0,只要用11011111(即0xDF,相当于0x20位求反)与flag进行位与运算,运算结果会将flag的第三位设置为0(不管该位原来是什么值),而不影响其他位的原值。,2.6 位运算,(3)“|”是将两个操作数的对应位作逻辑或运算。两个操作数对应的位均为0时,运算结果对应的位为0,否则为1。例如0x55|0xB4(即01010101与10110100逐位求逻辑或)结果为0xF5(即11110101)。“位或”的典型用法是用来设置标志字中的某一位为1,例如我们要设置flag左起第三位的状态为1,只要用00100000(即0x20)与flag进行位或运算,运算结果会将flag的第三位设置为1(不管该位原来是什么值),而不影响其他位的原值。,2.6 位运算,(4)“ ”是将两个操作数的对应位作异或运算。两个操作数对应的位相同(即均为0或均为1)时,运算结果对应的位为0,否则为1。例如0x55 0xB4(即01010101与10110100逐位求逻辑异或)结果为0xE1(即11100001)。“位异或”有一个重要性质,即对于任意y都有(yx)x=y,即对任意数据连续用x作两次位异或运算的结果是其本身。由于这一性质,“位异或”经常用于对数据进行简单的加密与解密,y是被加密的数据,x是密码,数据以yx的加密形式存放或传输,使用时再用x作一次位异或即得到解密数据。,2.6 位运算,(5)“” 是将左操作数的位向左移,移动次数由右操作数决定。每次移动过程中,右端出现的空位补0,移出左端的位舍弃。例如0xB42(即10110100向左连移两次)结果为11010000(即0xD0)。 (6)“” 是将左操作数的位向右移,移动次数由右操作数决定。每次移动过程中,左端出现的空位按原来的最左位的值补入,移出右端的位舍弃。例如: 0xB42(即10110100向右连移两次)结果为11101101(即0xED)。,2.6 位运算,由于左、右移位运算会丢失部分信息,所以左、右移位是不可逆的,即(xn)n或(xn)n不一定等于x。 与加、减、乘、除运算类似,位运算也提供了更简便的运算符=、=、&=、|=以及=。例如a=a&b可以写作a&=b,x=xy可以写作x=y。图2.3 位求反运算结果,2.6 位运算,【例2.7】位求反运算举例。 main() unsigned char a,b; a=0x9a; b=a; printf(“a:%xtb:%xna+b:%xn“,a,b,a+b); ,2.6 位运算,【例2.8】位逻辑运算举例。 main() unsigned char a,b; a=0xb9; b=0x83; printf(“a AND b=0x%xn“,a ,2.6 位运算,【例2.9】左移位操作举例。 main() unsigned char a,b; a=0x5b; b=a2; printf(“a: 0x%xn“,a); printf(“b: 0x%xn“,b); ,2.6 位运算,【例2.10】右移位操作举例。 main() unsigned char b; char a=-8; b=248; a=2; b=2; printf(“a = 0x%x=%dn“,a,a); printf(“b = 0x%x=%dn“,b,b); ,2.7 数组和指针,2.7.1 数组,数组是同一数据类型的变量的有序集合。 组成数组的变量称为数组元素。 数组属于构造数据类型。 按数组元素的类型不同,数组又可分为: 数值数组、 字符数组、 指针数组、 结构数组等。 数组元素在内存中(按行)连续存放。,2.7.1 数组,数组的声明 存储类别 数据类型 数组名元素个数; 如: a2,b23,name100,y234 数据类型是指数组元素的类型。 数组名须是一合法标识符。 方括号“ ”内的数称为下标,方括号对的个数称为数组的维数。通过数组名加下标对数组元素进行访问。 下标从0开始,必须是整型的常量或变量。 数组名就是数组第一个元素(如前例a2中的 a0)的地址(即a = &a0)。,2.7.1 数组,数组元素通过数组名加下标进行访问(下标实质上是一个偏移值)。 数组元素在内存中(按行)连续存放。 数组名就是数组第一个元素的地址,如前例: int a10; 则 a和&a0是等价的。,2.7.1 数组,数组的赋初值(初始化) 定义数组的同时进行初始化。如: int b5=1,3,2,4,6; 在定义整型b数组有5个元素的同时进行了初始化,即: b0=1,b1=3,b2=2,b3=4,b4=6。 若对数组进行初始化的数据的个数与数组元素的个数相同时,则定义数组时的元素个数可以省略,即下面的定义与上面的定义是等价的; int b = 1, 3, 2, 4, 6;,2.7.1 数组,【例2.11】数组初始化举例。 main() int a5=1,3,5,7,9,b23; b02=10; b12=100; printf(“a array: %d %d %d %d %dn“,a0,a1,a2,a3,a4); printf(“b02=%dn“,b02); printf(“b12=%dn“,b12); ,2.7.2 指针,指针是C语言中最具有代表性的特征之一,是必不可少的内容。 利用指针可以直接对内存中各种不同数据结构的数据进行快速的处理。并可方便地在各函数之间进行数据的传递。 与普通变量不同,指针的存储空间里存放的是另一个变量的地址。而普通变量的存储空间里存放的该变量自己的数值。 指针的类型不是它自己的类型,而是它指向的对象的数据类型。,2.7.2 指针,1指针的声明 对象的类型 *指针变量名; 如:int *px; float *py; char *pc; 若:int x=35, *p; p = 则: (1)p指针的值; / p的值是2001H (2)x的值;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论