




已阅读5页,还剩89页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Only those who have the patience to do simple things perfectly ever acquire the skill to do difficult things easily 。 只有有耐心圆满完成简单工作的人,才能够轻而易举地完成困难的事。,数的进制(补充内容) 常用的进制 日常生活中使用的数制有很多种,通常在计算机中采用的是二进制。由于二进制与八进制和十六进制有特殊的关系,所以在计算机中常常根据需要使用八进制或十六进制。 (1)十进制数:逢十进一,由数码09组成 (2)二进制数:逢二进一,由数码0、1组成 (3)八进制数:逢八进一,由数码07组成 (4)十六进制:逢十六进一,由数码09、字母af或AF 组成,第2章 基本数据及其运算,进制转换(补充内容) (1)十进制与其他进制之间的转换 转换规则:整数部分除以对应进制的基数逆序取余,小数部分则乘以相应进制基数顺序去整。 例 (67)10 = (1000011)2 基 余数 2 67 1 2 33 1 2 16 0 2 8 0 2 4 0 2 2 0 2 1 1 0,逆序取余数,例 (65)10 =(41)16 基 余数 16 65 1 16 4 4 0 例 (65)10 = (101)8 基 余数 8 65 1 8 8 0 8 1 1 0,逆序取余数,逆序取余数,例: (0.125)10 = (0.001)2 0.125 * 2 0.25 0 * 2 0.5 0 * 2 1.0 1 注意:如果乘2的结果是个无穷尽数,那么则根据需要截取若干位。,顺序取整数,(2)其他进制转换为十进制 转换规则:按权展开相加 例: (1100101011)2=1*2 +1* 2 +0*2 +0*2 +1*2 +0*2 +1*2 +0*2 +1*2 +1*2 =(811)10 例: (5E4)16= 5*16 +14* 16 + 4* 16 =(1508)10 (3)二进制、八进制和十六进制之间的转换 1)二进制、八进制之间的转换 二进制转八进制的规则:从低位(从右至左)起每3位组合成1位八进制数,不足三位时高位补零(即左侧补零),9,8,6,5,7,4,3,2,0,1,2,1,0,八进制转二进制规则:从低位(从右至左)起每1位八进制位转换为3位二进制数。 例: 试把二进制数101110011转换为八进制数。 1 0 1 1 1 0 0 1 1 5 6 3 (101110011)2 = (563)8 例: 试把八进制数123转换为二进制数 1 2 3 0 0 1 0 1 0 0 1 1,2)二进制、十六进制之间的转换 二进制转十六进制规则:从低位(从右至左)起每4位二进制位转换为1位十六进制数。 十六进制转二进制规则:从低位(从右至左)起每1位十六进制位转换为4位二进制数。 例: 试把二进制数101110011转换为十六进制数。 1 0 1 1 1 0 0 1 1 1 7 3 (101110011)2 = (173)16 例: 试把十六进制数E53转换为二进制数 E 5 3 1 1 1 0 0 1 0 1 0 0 1 1,2.1 基本类型数据,C语言中,基本数据有三种: 整数:整数是不带小数点和指数符号的数据。例如:29 浮点数:浮点数是带有小数点或指数符号的数值数据。例如:3.6 5.6e+02 字符:字符型数据表示一个字符,占用一个字节(8个二进制位)。 例如:a,2.1.1 整型数据,按其数值范围大小划分成三种: 1. 基本型:用 int 标记 2. 短整型:用 short int 标记,简写为 short 3. 长整型:用 long int 标记,简写为 long 按值内部的最高位不同理解又有两类: 1.带符号:存储单元最高位作为符号位 2.不带符号:存储单元中全部二进位用作存放数据本身,而没有符号位。 表示方法: unsigned int、 unsigned short、 unsigned long,例如 int i, j; /* 定义带符号的整型变量 */ unsigned short k; /* 定义无符号短整型变量 */ long m, n; /* 定义带符号的长整型变量 */ 注意:同一类型在不同版本占用字节数不同,不特殊说明的指的都是TC,类型,版本,出错指数:,ANSI 标准定义的整数类型 类型 比特数 取值范围 int 16 -3276832767 short 16 -3276832767 long 32 -21474836482147483647 unsigned int 16 065535 unsigned short 16 065535 unsigned long 32 04294967297,整型变量的值在内存中的存放形式 数据在内存中是以二进制补码形式存放的。 例:int i ,j; i=10; j=-10;,基本整型表示的数值范围,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,图2-1(a) 带符号整数,值为32767(即215-1),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,图2-1(b) 带符号整数,-1(负数用补码表示),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,图2-1(c) 无符号整数,值为65535(即216-1),整型变量的定义 对变量强制类型定义的目的:让编译为其分配内存单元。 各种变量的定义一般在函数的开始部分 例 #include void main( ) int a,b,c,d; unsigned int u; /*变量强制类型定义 a=12; b=-24; u=10; c=a+u; d=b+u; printf(“a+u=%d,b+u=%dn”,c,b+u); 运算结果:a+u=22, b+u=-14 由此可见:不同类型的整型数据可以进行混合运算,出错指数:,整型数据的溢出 int型变量最大允许值为32767,如果大于此数,将产生溢出 例:整型数据的溢出情况(注意:此题是在turbo c编译环境下即 int是2个字节) #include void main( ) int a,b; a=32767; b=a+1; printf(“%d,%d”,a,b); 从上图可知,变量a的最高位为0,低15位为1,表示32767 而变量b最高位为1,低15位为0,表示-32768。此种情况,编译系统不会报错,这要靠编程者的细心和经验。,出错指数:,运行结果:32767,-32768,整型常量的类型 整型常量本身隐含了某种数据类型,将整型常量赋给整型变量时,要考虑常量的大小和变量所能表示的数据范围。 一个整数,其值在如下范围: (1)-3276832767 int , short int, long int (2)-21474836482147483647 long int (3)对于非负数, 如:065535 unsigned int, unsigned short, unsigned int 04294967295 unsigned long,说明: 1.常量中没有 unsigned 类型的数,正整数可赋给unsigned 变量,只要数值不超过范围。 2.在函数调用时,若被调用函数的形参是长整型变量,则要求主调函数的实参也是长整型数据。,出错指数:,整型常量的书写形式, 十进制整数:如 0,123,-45。 八进制整数:以数字0开头,并由07组成的数字符序列。如:0123表示八进制整数,其值等于十进制整数为:1*82 + 2*81 + 3 = 83 十六进制整数:以0x(或0X)开头,并由十六进制数的数字符组成的数字符序列。表示十六进制数的数字符有 16 个:09 和 A、B、C、D、E、F,其中六个字母也可以小写。 如:0x123表示十六进制整数,其值等于十进制整数为:1*162 + 2*161 + 3 = 291;0xabc,其值等于10*162 + 11*161 + 12 = 2748。, 长整型整数和无符号整数的表示, long 型整数:在整型常数后加字母 L 或 l,即为long 型整型常数。 例如:0L、132L 等。 不带符号的整型:在整型常数后加字母 U 或 u,即为 unsigned 型整型常数。 例如:1U、122U 等。 不带符号的 long 型整数:在整型常数后同时加上字母 U 和 L,表明该整型常数是 unsigned long 型。 例如: 22UL、35LU 等。,出错指数:,2.1.2 浮点型数据,按数值范围大小和精度不同分成三种: 1. 单精度型:用 float 标记-在内存中占用4个字节(32个二进位),7个十进位有效数字,能表示绝对值约为10-371038。 如: float x, y; 2. 双精度型:用 double 标记-在内存中占用8个字节(64个二进位),16个十进位有效数字,能表示绝对值约为10-307 10308。 如: double result; 3. 长双精度实型:用 long double 标记- long double型数据一般占用比double型数据更多的字节,通常为16个字节。但在VC中,也只占用8个字节。 如:long double z;,浮点数的一般书写格式 正负号 整数部分.小数部分 指数部分,注意: (1)整数部分和小数部分可以任选,但不可同时没有。 (2)小数点和指数部分不可以同时都没有。 (3)指数部分是以一个字母e或E(代表10)开头,后跟一个整数。 例如:合法的浮点常数:7.、.457、1E5、 1.5e-6 不正确的浮点常数: E4、.E5、4.0E,出错指数:,(4) 在浮点数后加f表示float;加L(或l)表示long double 型,在浮点数的最后不加任何字母,C系统认为此数是 double 型。 例如: 1.5 表示double型 1.5f 表示float型 1.5L 表示long double型,出错指数:,注意要点:,(2)浮点数运算有一定的计算误差 例如:要判别两个浮点型变量x和y是否相等 正确:fabs(x-y)1e-6 /* x与y非常接近则认为相等*/ /* fabs()是求绝对值的函数*/ 错误:x = y /* x与y不可能完全相等 */,(1)接受的浮点数与书写会有一定的误差 例如: float x = 1.23456789; 因x只能存储约7位有效数字,浮点数1.23456789所对应的二进制形式中,超出存储位数的那些位不会被存储。,出错指数:,(3)未加说明,系统将实型常量作为双精度处理 float f; f=2.45678*4532.65 系统将两数按双精度运算,然后将前7位赋给实型变量f, 缺点:浪费系统资源,降低运算速度; 解决的办法:在数的后面加f,如2.45678f,系统将其按单精度数运算。,(4)实型常量赋给float或double类型变量时,根据变量的类型截取实型常量的有效位。 #include void main( ) float f1; double f2; f1=111111.111; f2=111111.11111; printf(“f1=%fnf2=%lfn”,f1,f2); 输出结果:,f1=111111.109375 f2=111111.111111,实型常量可赋给 float 或double型变量,根据变量类型截取实型常量的有效位。 单精度实型数据(float)表示数据范围: 十进制形式:7位有效位 指数形式: . e 双精度实型数据(double)表示范围: 十进制形式:16位有效位 指数形式:. e 长双精度实型数据(long double)表示数据范围: 十进制形式:19位有效位 指数形式:. e ,2.1.3 字符型数据,字符型数据用于表示一个字符值。 字符型数据的内部表示是字符的ASCII代码(以二进制形式)。 例如:A的ASCII值为65,内存中存的是:1000001 字符型数据的类型符用char来标记。 如:char c1, c2; 字符型数据可看作是-128127或0255的一个整数。,普通字符常量,普通字符常量:用单引号括住的一个字符。例如:a、B、$ 例 字符型数据与整型数据通用的示例程序。 #include void main() char c1, c2; c1 = 97; c2 = c1+1; /* 字符型数据与整型数据混合运算 */ printf(“c2 = %c, c2s ASCII code = %d n“, c2, c2); ,c2 = b, c2s ASCII code = 98,转义字符常量,转义字符常量:用 字符 或 字符列 来标记。 例如: r :回车符 光标位置移到当前行首 t :制表符 使输出位置横向跳至下一个输出区开始列。屏幕自 左向右每8列为一个输出区。,一个制表位,a 响铃 b 退格(Backspace键) n 换行符,光标位置移到下一行首 反斜杠符 单引号符 “ 双引号符“ 0 字符串结束符 ddd ddd为1至3个8进制数字 如,12也能表示换行符n xhh hh为1至2个16进制数字 如,x41也能表示大写字母A,需要牢记:,例: #include void main ( ) char c1= 376 ; unsigned char c2=376; printf (“%d, %c n”,c1 , c1); printf (“%d , %c n”, c2, c2); ,char c1 unsigned char c2,运行结果: -2 , 254, 请见附录,注意: 1.字符的ASCII值都是正的 2.如果为一个字符变量赋值一个负数,当要输出字符时则将该负数的补码当做正值,找到相对应的字符输出。,例: #include void main ( ) printf (“ ab ct derftgn”); printf (“htibbj kn”); 运行结果: f gde h j k,注意:t在跳到下一制表位的过程中用 填充它经过的位置,字符串常量,字符串常量:用双引号括起来的一串字符。 例如:“I am a student.“、“China“、“a“ 普通字符与字符串的区别,出错指数:,注意要点:字符型与字符串常量的区别,例如:char c=a char c= “a“ 又如:字符串“China”在内存中的存储形式(需要6个字节),出错指数:,2.2 数据运算, 运算符的优先级 优先级用来标志运算符在表达式中的运算顺序。优先级高的先运算,优先级低的后运算。 如:x-y*z 相当于 x-(y*z) 运算符的结合性 在优先级相同情况下,表达式的计算顺序由结合性来确定。大多数运算符的结合性是从左至右,只有单目、三目和赋值运算符的结合性是从右至左的。 如:x=a+b-c; a=b=c=1.5;,x=(a+b-c),a=(b=(c=1.5),出错指数:,2.2.1 赋值运算,简单赋值形式: 变量 = 表达式 赋值表达式的结果是等号左边变量的值 (1)计算表达式,并将计算的值赋给变量; (2)如表达式类型与变量类型不一致,将表达式值的类型自动转换成变量的类型; (3) 将表达式的值赋给变量。 说明:赋值运算符的结合性是“自右至左”。,出错指数:,2.2.1 赋值运算,例1:int x; double y; y = x = 3.5; 例2:i=4+(j=7); 例3:i=(j=3)+(k=8);,x的值为3, y的值为3.0 表达式的值为3.0,使j值为7,i值为11,表达式的值为11,使j值为3,k为8,i为11,表达式的值为11,类型转换(补充内容) 变量类型的不同,所接收的数据也是不同的,当赋值运算符两侧的数据类型不一致时,在赋值时要进行类型转换。 (1)实型数据赋给整型变量时,舍去实型数据的小数部分。 如:int i; i=3.56; 结果i的值为3 (2)整型数据赋给实型变量时,数值不变,但以浮点形式存放于内存。 如: float a=23; 先将23转换成23.00000,然后送a中。 double b=23; 先将23转换为23.00000000000000,然后送b中。,(3) double型数据赋给float变量 截取其前面的7位有效数字,存放到float单元,应注意数值范围不能溢出 如:float f; double d=123.45678e65; f=d; 由于数据溢出,f将得到错误的值 float 数据赋给double变量时,数值不变,有效位扩展到16位。,(4)字符型数据赋给整型变量 字符数据占一个字节,整型数据占两个字节,字符数据存入整型变量的低8位,有两种情况: 无符号字符型数据赋给整型变量时:将其存放在整型变量的低8位中,而高位以0补齐,#include void main ( ) int i; unsigned char c ; c=376; i=c; printf(“i=%d, c=%dn”, i, c); 结果:,i=254 c=254,带符号的字符型数据赋给整型变量时 若最高位为1(负数),则整型变量的高8位补1,若最高位为0(正数)则整型变量高8位补0。 例 #include void main( ) int i; char c; c=376; i=c; printf (“i=%d,c=%dn”,i,c); ,运行结果:i= -2,c= -2,(5)int, short, long型数据赋给char变量,则将其低位赋给char型变量 例 #include void main() int i=289; char c=a; c=i; printf(“i=%d,c=%dd”,i,c); ,运算结果:i=289,c=33,(6)long型数据赋给int型变量,将long型数据的低16位赋给int型变量 例 void main() int a; long b=65544; a=b; printf(“a=%d,b=%ldn”,a,b); ,a=8,符号位,b=65544,运算结果:a=8,b=65544,45,(7).将unsigned int 型数据赋给 long 型变量时 将unsigned int 型数据送到 long int 型变量的低16位,long int的变量高16位补0 例 #include void main ( ) unsigned a=65535; long b; b=a; printf(“a=%u ,b=%ldn”, a, b); ,输出: a=65535,b=65535,若无符号数据赋给相同长度的带符号的变量时,则原样赋给。 unsigned int int unsigned short short int unsigned long long int 要注意数据的有效位占据符号位 例 void main( ) unsigned int a=65535; int b; b=a; printf (“a=% u ,b=%dn”,a,b); ,运算结果:a=65535,b= -1,(8)将带符号的数赋给长度相同的无符号变量 过程:原样赋给 例 #include void main( ) unsigned int a; int b= -1; a=b; printf (“a=% u,b=%dn”,a,b); ,1 111111111111111,1 111111111111111,a,b,符号位,数值位,运算结果: a=65535,b= -1,总结: 字节数多的赋给字节数少的:截断 字节数少的赋给字节数多的:符号扩展 相同字节数赋值:原样赋值,变量赋初值 定义的同时给变量赋初值 如:int a=3; float b=3.1415; char c=x; 2.定义变量时,可以对其中的一部分变量赋初值 如: int a=3, b, c, d=8; 3.把一个常量赋给不同变量时,最好分别进行。 如:int a=b=c=3; 错误 而应写为:int a=3,b=3,c=3; 4.初始化是在程序运行时,执行本函数时赋以初值的。 如:int a=3; 相当于:int a; a=3;,赋值运算复合赋值运算,在赋值运算符“=”之前加上其他运算符,可构成复合运算符。 复合运算符: +=、-=、*=、/=、%=、=、&=、=、|= 例:x + = 5.0 等价于 x = x + 5.0 (将“x +”移到“=”右侧) x * = u + v 等价于 x = x * (u + v) a + = a - = b + 2 等价于 a = a+(a=a-(b+2),出错指数:,例 #include void main( ) int a=12, b; b=(a+=a-=a*a); printf (“a=%d, b=%dn”,a,b); ,运算结果: a= -264,b= -264 a + = a- = a*a a=a-a*a 12-12*12 -132 a=a+(-132) -132+(-132) -264,出错指数:,2.2.2 算术运算一般运算符,单目运算符:+(取正)、-(取负) 双目运算符:+(加)、-(减)、*(乘)、/(除)、%(求余) 说明:(1) 两个整数相除结果为整数(取整),若有一个数为浮点数,则结果为浮点数。 (2) 求余运算符(%): 要求参与运算的两个分量均为整型数据,如 5 % 3 = 2。求余运算所得结果的符号与被除数的符号相同。如: -5 % 3 = -2 , 5 % -3 = 2 。 (3)加、减、乘、除和求余运算都是双目运算符,结合性都是从左至右的。取正(+)、取负(-)是单目运算符,结合性是从右至左。优先级:+(取正)、-(取负)高于*、/、%高于+(加)、-(减)。,出错指数:,例:整型数据除法运算 #include void main ( ) int a,b,c; a=5; b=3; c=a/b; printf(“c=%dn”,c); ,出错指数:,运算结果:c=1,例 实型数据除法运算 #include void main ( ) float a,b,c; a=5; b=3; c=a/b; printf (“%fn”,c); ,运算结果:1.666667,算术运算自增和自减运算符,+i 前缀形式,表示在引用变量i之前,先使i加1,以加1后的i值为运算结果; -i 前缀形式,表示在引用变量i之前,先使i减1,以减1后的i值为运算结果; i+ 后缀形式,表示在引用变量i之后,才使i加1,即以增1前的i值为运算结果; i- 后缀形式,表示在引用变量i之后,才使i减1,即以减1前的i值为运算结果。,自增/自减运算符例,例如: i = 4; j = +i; i = 4; j = i+; i = 4; j = -i; i = 4; j = i-;,i结果为5,j的结果为5,i结果为5,j的结果为4,i结果为3,j的结果为3,i结果为3,j的结果为4,例 #include void main( ) int i,j; i=3;j=i+; printf (“i=%d,j=%dn”,i,j); 说明: 1.+,-运算符只能用于变量,而不能用于常量和表达式。 如a+,b-是正确的,而5+,(x+y)-却是错误的。 2.+,- -运算符的结合方向是从右向左,与-运算符优先级相同,出错指数:,运算结果:i=4,j=3,例void main( ) int i; i=3; printf (“i1=%dn”,-i+); printf (“i2=%dn”,i); 例void main( ) int i; i=3; printf (“i1=%dn”,-+i); printf (“i2=%dn”,i); ,运算结果:i1=-3 i2=4,运算结果:i1= - 4 i2= 4,有关表达式使用中的问题说明 (1)C中的运算符和表达式: 表达式中的子表达式的求值顺序各编译系统是有差别的。 如对表达式: a=f1( ) + f2( ) 一般情况下是先调用f1( ),再调用f2( ),先后次序无关紧要,但有些情况,结果却不同,编程时要注意所用的编译系统,我们主要是以Turbo C加以讨论。 又如i=3,表达式: (i+) + (i+) + (i+) 有的系统的求值顺序是先求第一个,再求第二个最后求第三个子表达式,其结果是: 3+4+5=12, 最后i的值为6 而在Turbo C中却有所不同:,例 #include void main( ) int i=3,j=3,k,q; k=(i+)+(i+)+(i+); q=(+j)+(+j)+(+j); printf (“i=%d,j=%d,k=%d,q=%dn”,i,j,k,q); ,运算结果:i=6,j=6,k=9,q=18,出错指数:,上述情况有时往往造成混淆,解决的方法:把各中间结果先计算送各中间变量,然后相加。 例 #include void 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,VC+环境下连续自增(自减)运算规则(补充): 1、 在一般表达式中和在函数参数中计算的结果相同(这一点与Turbo C环境不同); 2、 后缀:同表达式中Turbo C的情况相同:先统一取值后依次自增,如: int a,i=5; a=i+i+i+; a=15, i=8. 3、 前缀:前两个自增同Turbo C,即依次自增后统一取值,后面的每个自增后即取值,如: int a, i=5; a= +i +(+i)+(+i); a=22, i=8.,4、 前后缀混合的情况: (1) 一般情况:表达式中自左向右计算,参数自右向左运算。前缀自增后取值;后缀(或变量)取值依其所处位置而定,有连续多个将统一取值,其自增在语句结束前进行。 (2) 前后缀各有一个的情况:设int i=5; 由于i+*+i应满足交换率与+i*i+相同,规定按后者计算故为36。 int i=5; printf(“%d,%dn”, -i, i+*+i ); 打印5,36。,(3) 若i+或+i或两者有多于一个的情况:+i有两个以上在一起时最左边的连续自增同3、,其余每个自增后取值,如:int i=5; printf(“%dn%dn“,-i,(+i)+(i+)+(i+)+(+i); 打印6和25 printf(“%dn%dn“,-i,(+i)+(+i)+(+i)+(+i)+(i+); 打印8和40 printf(“%dn%dn“,-i,(+i)+(+i)+(+i)+i+(+i)+(+ i); 打印9和49 (4) 函数参数中有括号时,括号参数优先计算,其余参数仍自右向左计算,如: int i=9,j=8; printf(“%d %dn“, (+i, j-), +i); 打印8 11 printf(“%d %d %dn“, (+i, j-), +i, i); 打印8 11 10 (5) 最后i的值等于原值加总自增次数减自减的次数.,(2)在C语言中运算符的确定 在由多个字符组成的表达式中,应尽可能多地从左向右将若干个字符组成一个运算符。 如:i+j 其结合性是:(i+) +j 而不是:i+(+j) 。 (3)printf 函数输出实参的顺序 如:int i=3; printf (“%d,%dn”,i,i+); 有的系统按从左到右的顺序求值,输出结果是:3,3 而Turbo C 是按从右到左顺序求值,输出结果是:4,3 结论:不写别人甚至自己都看不懂的程序,也不写那些不知道系统会怎样运行的程序,2.2.3 关系运算和逻辑运算,关系运算符:、=、=、!= 关系运算符用于对两个值进行关系比较,判定比较条件是否满足。在语言中,条件满足的值为1;条件不满足为 0。 (1) 优先级:、= 高于 =,!= 如: 表达式 x y = c y) = (c u+v 等价于 x (u+v) (3) 关系运算符的结合方向是自左至右的 如: i=1,j=2,k=3 则表达式 kji 的值为,0,出错指数:,2.2.3 关系运算和逻辑运算,逻辑运算符 &(逻辑与)、| (逻辑或)、! (逻辑非) 其中:运算符 & 和 | 是双目运算符,要求有两个运算数;运算符 ! 是单目运算符,只要求一个运算数。 优先级:! & | 说明:逻辑运算结果也是一个逻辑量,即真(用1表示)或假(用0表示)。判定一个运算分量的值为真或假时,以运算分量的值不等于零为真,值等于0 为假。,高于,高于,逻辑运算(真值表),a b !a a & b a | b 非0 非0 0 1 1 非0 0 0 0 1 0 非0 1 0 1 0 0 1 0 0 优先级: ! (非) 高 算术运算符 关系运算符 & | 赋值运算符 低,2.2.3 关系运算和逻辑运算-例,例如: a b & x y (a b) & (x y) a != b | x != y (a != b) | (x != y) x = 0 | x y (x = 0) | (x y) !a & b | x y & z y) &(zy),2.2.3 关系运算和逻辑运算-例,在算术、关系、逻辑混合运算的表达式中,不同位置上出现的运算分量,应区分哪些是算术运算分量、哪些是关系运算分量和哪些是逻辑运算分量。 例 如: 2 1 & 4 & 7 1) & 4) & (7 (3 + (!0) ) ),2.2.3 关系运算和逻辑运算,例:判别某一年是否为闰年? 闰年是满足以下两个条件之一: (1)该年份能被4整除,但不能被100整除 (2)该年份能被400整除 用逻辑表达式可描述闰年条件: (year%4 = 0 & year%100 != 0) | year%400 = 0 可简化为: (year%4 = 0 & year%100) | year%400 = 0 表达式结果为真表明是闰年,为假是非闰年。,2.3.3 关系运算和逻辑运算,“逻辑与”和“逻辑或”运算符的性质: a & b 当 a 为 0 时,结果为 0,不必再计算 b;仅当a为非0时,才需计算 b。 a | b 当 a 为 1 时,结果为 1,不必再计算 b ,仅当a为0时,才需计算b。 例1:a=1, b=2, c=3, d=4, m=0, n=6 (m=ab) & (n=cd) m= ? n= ?,出错指数:, m = 0, n=cd不计算,n仍为6,2.3.3 关系运算和逻辑运算,例2: int a = 1, b = 1, c = 1; 计算 +a | +b & +c ,因+a非0,不再计算逻辑或右边表达式+b & +c。该表达式计算后,变量a的值变为2,而变量b和c的值不变,依旧为1。 注意书写顺序: 例 如: y/x 2 且 x != 0 应写成: x != 0 & y/x 2 这样可避免除0的错误 因为,当 x 为 0 时,不会计算 y/x 而写成: y/x 2 & x != 0 是危险的, 因为当 x 为 0 时,不能计算 y/x。,出错指数:,2.2.4 条件运算,形式: 表达式1 ?表达式2 :表达式3 执行过程: (1) 计算表达式1; (2) 如果表达式1的值非0(真),则计算表达式2,并作为整个条件表达式的结果(不再计算表达式3); (3) 如果表达式1的值为0(假),则计算表达式3,并作为整个条件表达式的结果(不再计算表达式2)。 例如:x y ? x : y 如果 x y 为真,则条件运算取x值,否则取y值。 说明:条件运算符(?:)优先级高于赋值运算符,低于逻辑运算符、关系运算符和算术运算符。,2.2.4 条件运算,条件运算符的结合性为“自右至左”。 例 如: x y ? x : u v ? u : v 等价于: x y ? x : (u v ? u : v) 条件运算三个运算分量的数据类型可以各不相同。语言约定,类型低的向类型高的转换。 如: i j ? 2 : 3.5 当 i j 时,条件表达式的值为2.0;否则为3.5。,出错指数:,2.2.5 其他运算符 逗号运算,形式:表达式1,表达式2, ,表达式n 执行过程: (1) 从左至右依次计算各个表达式; (2) 最后一个表达式的值作为整个逗号表达式运算的结果。 例如:x = (i = 3, i * 2) 结果:使i等于3,x等于6。 说明: 1. 逗号运算目的是将多个表达式“串连”起来,分别得到各表达式的值。 2. 逗号运算常用于 for 循环结构,用于给多个变量赋初值。 3. 逗号运算符的优先级最低。,2.2.5 其他运算符sizeof 运算,形式:sizeof (类型名) 或 sizeof 变量 作用:给出运算对象在内存中所占用的字节数。 例: int x=1; float y=2; double z=4; printf(“int=%d, float=%d, double=%dn“, sizeof x, sizeof (float), sizeof z); 结果:int=4, float=4, double=8,2.2.5 其他运算符 位运算,位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息结果。 位运算符按优先级从高到低依次为: (位反)、 & (位与)、 (位异或)、| (位或) 说明: 位反是单目运算符,其余均为双目运算符。,位运算 位与运算(&),位与规则: 0 & 0 = 0 ,0 & 1 = 0 ,1 & 0 = 0,1 & 1 = 1 即:同为 1 的位,结果为 1,否则结果为 0。 例如:53 & 22的结果为20 0000000000110101 (十进制53,八进制为65) & 0000000000010110 (十进制22,八进制为26) 0000000000010100 (十进制20,八进制为24) 按位与运算典型用法: 1. 取一个位串的某几位 例如,截取x的最低7位:x & 0177 2. 保留变量某几位,其余位置0 例如,保留x最低6位:x = x & 077,位运算位或运算(|),位与规则: 0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1 即:只要有1个是1的位,结果为1,否则为0。 例如:53 | 22的结果为55 0000000000110101 (十进制53,八进制为65) | 0000000000010110 (十进制22,八进制为26) 0000000000110111 (十进制55,八进制为67) 按位或运算典型用法: 将一个位串的某几位置成1。 例如:将变量x的最低4位设置为1,其余位不变: x = 017 | x,位运算位异或运算(),位与规则:0 0 = 0,0 1 = 1,1 0 = 1,1 1 = 0 即:相应位的值相同的结果为0,不相同的结果为1。 例如:53 22的结果为35 0000000000110101 (十进制53,八进制为65) 0000000000010110 (十进制22,八进制为26) 0000000000100011 (十进制35,八进制为43) 按位异或运算典型用法: 将一个位串某几位取反。例如:将变量x的最低4位取反,其余位不变: x = 017 x,位运算位反运算(),位与规则: 0 = 1 1 = 0 即:0取反结果为1,1取反为0。 例如: 53 的结果为 -54 0000000000110101 (十进制53,八进制为65) 1111111111001010 (十进制-54 ,八进制为177712),位运算移位运算,将整型数据或字符型数据作为二进位的位串,整体向左或向右移动。 (1) 左移运算 x y x右移y位,每右移1位相当于除以2 例如: 12 2 结果为 3 说明:移位运算符的优先级低于算术运算符,高于关系运算符。,2.3 表达式,表达式:由运算符和运算分量构成。 表达式的值:按运算符的优先级和结合性的要求进行运算,最终得到的结果。 2.3.1 表达式分类 算术表达式: 如,a+5.2/3.0-9%5 关系表达式: 如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年焊接工艺实操指南与模拟题答案
- 2025年度智能矿山货物装卸与绿色运输安全协议书
- 2025年夫妻财产共有及家庭生活规划协议书
- 2025年文化创意园区场地租赁补充协议执行细则
- 2025版融资租赁反担保保证合同正式版
- 2025年财务专业知识在物资仓库管理中的应用模拟题及解析
- 2025年市场营销师高级考试模拟题集与答案详解
- 2025版生物制药研发与生产购销合同生物医药
- 2025版房产互换与智能家居系统集成合同
- 2025版汽车销售租赁合同:汽车销售租赁与增值服务合同
- IT系统灾难恢复计划
- 通信基站机房节能减排方案
- 维修档案管理制度范文(2篇)
- CPK计算表格电子表格
- 2025年中国人保招聘笔试参考题库含答案解析
- 专业音响设备租赁合同
- 园区消防安全联动制度
- 《专业导论》课程教学大纲
- 初中必背古诗文138首
- 奉化区地图宁波市奉化区乡镇街道地图高清矢量可填充编辑地图模板
- 变电站巡视检查项目记录表
评论
0/150
提交评论