您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 程序设计基础第三章补充知识汇总
程序设计基础第三章补充知识汇总关于各类型常量的说明:(1)整型默认为signedint型,后加U或L可改变类型;有十/八/十六进制三种写法(2)实型默认为double型,后可加f指定为float型,分小数形式和指数形式两种;指数形式表示时E或e前不能空,e后为整数(3)字符型常量默认为signedchar;分普通字符和转义字符两种.具体有哪些转义字符看书自学。务必注意字符型常量是用单引号括起来的单个字符,如charc=’a’,a=‘a’,不加单引号错;此外,字符型变量的内存单元中实际存放字符的ASCII码,如上例存97。正是由于字符型数据实际对应一整数,故字符型与整型有时可通用:inti=‘a’;charc=97;intj=‘a’-32;charb=c-32;(4)字符串常量是””括起来的串,末位自动添加结束符’\0’,务必区分’A’与”A”(5)-32768U与-32768在寄存器中存储结构一样,均为FFFF8000。区别在于,设有Unsignedx;则x=-32768会有警告,而x=-32768U无警告符号常量:在编译阶段直接被替换为所代表的常数,不为其分配内存,不能赋值。符号常量定义语句后无分号变量:变量实际对应内存中一个内存块,块大小由变量类型决定,根据变量名可找到对应的内存块;为变量赋值就是根据变量名找到相应内存块,之后将数据(位于CPU寄存器)写入其中;取变量的值就是通过变量名找到相应的内存块,从其中读取数据到CPU寄存器。注意变量必须先定义后使用;一次可定义多个同类型的变量;使用前通常赋初值,可定义同时赋值(如inti=0)自动类型转换:某些类型的数据一旦参与运算(即进入CPU寄存器时),或者不同类型的数据进行混合运算时,数据类型就会发生自动转换,称之为自动类型转换转换规则:范围小到大,等值转换(不同编译器规则不尽同,VC如下)char与short进入CPU时自动转换为等值int;【符号位扩展】unsignedchar/short进CPU自动转为unsignedint;【高位补零】float进CPU直接转为double;【指数部分与尾数部分分别扩充】无论哪种整型与double型混合运算,整型均转为等值double型其余:类型长短不一时,以较长的为准,长度相同时,有符号的转化为无符号的,如32767+1L结果32768L例:234-‘b’+26.5强制类型转换:对变量进行强制类型转换时只是在CPU寄存器中对变量值作临时转换,变量类型及其在内存中的数据保持不变,如以下语句执行后x仍为float型,值仍然为3.5:floatx=3.5;inti=(float)x;注:假设floatx=3.5,y=3.5;则(int)x+y为实数值6.5;而(int)(x+y)值为7#includestdio.hvoidmain(){printf(%d\n,(int)3.5);printf(%d\n,(int)-3.5);printf(%lf\n,(double)3);printf(%lf\n,(double)-3);printf(“%lf\n”,5/3);//不匹配,故结果错printf(%lf\n,(double)5/3);}//注:printf(“%lf\n”,1)输出0.000000格式输出函数中格式控制符说明正常情况:格式控制符%d用于输入输出有符号整型数,%u用于无符号整型数,%X或%O以十六或八进制输出各类整型;%f用于float,%lf用于double,%c用于char原理说明:输出值先进入寄存器(可能要扩充),以%c输出则截取寄存器最末一字节输出其对应的字符;以%d输出意味着将寄存器中的数据当作signedint的补码,输出此补码对应的真值;以%u输出意味着将寄存器中的数据当作一个unsignedint,直接转换为十进制数后输出;以%X输出则将寄存器中的二进制数从低到高四位合一位输出,高位零省略;以%O则三位合一位输出例:以下为VC下分析,寄存器中扩充成int或unsignedint后占4字节,TC下扩充成int或unsignedint后占2字节。shorta;unsignedshortc;shorte;a=100;/*R(100)=0x00000064;M(a)=0x0064*/e=50000;/*R(50000)=0x0000C350;M(e)=0xC350*/c=a=e;/*R(e)=0xffffC350;M(a)=0xC350*//*R(a)=0xFFFFC350;M(c)=0xC350*/printf(“%d\n”,a);/*R(a)=0xFFFFC350;输出-15536*/printf(“%u\n”,c);输出50000*/printf(“%x\n”,a);//R(a)=0xFFFFC350,VC:ffffc350,TC:C350printf(“%o\n”,c);/*R(c)=0x0000C350;输出141520*/针对算术运算符:(1)除运算符/:分子分母均整型时是整除.分子分母有负数时先求绝对值之商,后加符号:如15/(-4)为-3;(-15)/4为-3(2)取余运算符%:操作数均整型方可,否则编译错.分子分母有负数时,先求绝对值之商,后根据分子定符号:15%4为3;15%(-4)为3;(-15)%4为-3;(-15)%(-4)为-3(3)自增运算符++:变量自增运算符,操作对象必须为变量,如x++或++x,但(x+y)++错。x++是先将变量的值读入寄存器参与运算,当前语句结束后再将内存中x的值增1;++x是将内存中变量值增1,之后再读入运算器参与运算。简单说就是x++是先使用后自增;而++x是先增1后使用(4)自减运算符--:类似自增运算符,只是变量减1(5)运算符++---均单目运算符,优先级高于其它算术运算符,且均为右结合。如i=3;j=-i++;相当于j=-(i++);针对赋值运算符:(1)赋值运算符:简单赋值运算符=;复合赋值运算符+=*=…如:x=3;x+=3相当x=x+3;x%=y+3相当x=x%(y+3),其它如-=/=等依此类推(2)不同类型数据间的赋值:①double型值=float变量:指数部分与尾数部分分别截取,转换成十进制相当于截取其前7位有效数字②double值=整型变量:舍弃小数部分,存整数部分③整型数据=实型变量:以等值的浮点数形式存储④各类整型、字符型之间:先将右侧值读入寄存器(遵循前述自动类型转换规则,在VC下内存位数不足2字节者均扩展成4字节,有符号数按符号位扩展,无符号数作零扩展),之后截断相应数目的字节放入左侧变量的存储单元如:以下为VC下分析,寄存器中扩充成int或unsignedint后占4字节,TC下扩充成int或unsignedint后占2字节。charc1,c2;c1=300;//R(300)=0x0000012C;M(c1)=0x2Cc2=400;//R(400)=0x00000190;M(c2)=0x90printf(“%c%c\n”,c1,c2);//R(c1)=0000002c,//R(c2)=ffffff90;截取末字节,VC输出,?;TC输出,Éprintf(“%d%d\n”,c1,c2);//R(c1)=0000002c,//R(c2)=ffffff90;分别是44和-112补码,输出44与-112(3)赋值语句右侧可为任意表达式,左侧必须为变量(4)赋值表达式类型与值取决于左侧变量.如charc;printf(“%d”,c=400);显示144.(5)赋值表达式可作变量用,相当于左侧变量,如(a=3*5)=4*6可,a=3*5=4*6错(6)赋值语句具有右结合性。优先级比常见运算符都低charc;i=c=259;a=(b=4)+(c=6)a+=a-=a*a相当于a=a+(a=a-a*a);(7)赋值表达式不同于赋值语句,printf(“%d”,i=3);合法,而printf(“%d”,i=3;);不合法针对关系运算符::====!=格式:30x0i==0x!=y(1)关系运算成立时结果为1,不成立时结果为0。(2)==是判断相等,=是赋值,前者返回0或1,后者返回左侧变量值。C语言中判断一个量时认为零为假,非零为真。如if(i=0)printf(“neverexecutable!”);if(i==0)printf(“executableifiequalszero!”)if(i=1)printf(“alwaysexecutable!”);if(i==1)printf(“executableifiequalsone!”)(3):左结合,优先级整体上低于算术运算符,高于赋值运算符。内部而言,==和!=低于其它=等其它关系运算符针对P82逻辑运算符:!(逻辑非)&&(逻辑与)||(逻辑或)(1)格式:如x0&&y0x0||y0!(x0)(2)运算依据:成立则表达式值1,否则值为0(3)结合性与优先级:左结合,!与单目算术运算符~双目算术运算符~关系运算符~&&~||~赋值运算符(4)逻辑表达式:用逻辑运算符将表达式连接起来的式子。注意C语言中只要值非零就认为是真,零就认为是假(5)举例:a=4,b=5,c=6时:!a值为0a&&b值为1a||b值为1!a||b值为14&&0||2值为153&&84-!0值为0!(ab)&&xy;ab&&ac||a0;(6)说明:在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。a&&b&&c只有a为真时,才需要判断b的值,只有a和b都为真时,才需要判断c的值。a||b||c只要a为真,就不必判断b和c的值,只有a为假,才判断b。a和b都为假才判断c设a=1;b=2;c=3;d=4;m=1;n=1;则经(m=ab)&&(n=cd)后,m的值为0,而n的值仍为1。针对P83条件运算符:表达式1?表达式2∶表达式3(1)功能:表达式1成立吗(非零),成立则结果为表达式2的值,否则结果为表达式1的值(2)如:max=ab?a:b;或min=ab?a:b;(3)优先级:条件运算符优先级仅比赋值运算符高(4)结合方向:自右至左,同赋值运算符和单目运算符,如ab?a:cd?c:d理解为ab?a:(cd?c:d)(5)条件表达式还可是赋值表达式或函数表达式,如:x0?y=x:y=-x;x0?printf(“%d”,y=x):printf(“%d”,y=-x);(6)三个表达式的类型可不同,表达式类型为后两个表达式中较高者,如xy?1:1.5;当xy时返回1.0针对逗号运算符:表达式1,表达式2,,……,表达式n(1)功能:顺序“计算”各表达式,整个式子的值和类型取决于最末一个表达式(2)如:i=1,sum=0(3)优先级和结合性:左结合,优先级最低(记)(4)比较printf(“%d”,x=(a=3,6*3))与printf(“%d”,(x=a=3,6*3));(5)逗号表达式最常用于for循环中。如for(i=1,sum=0;i=100;++i)sum=sum+i;针对P92例3.29:\t是跳到从当前位置开始的下一个水平制表位。所谓水平制表位是指屏幕上的第1列、第9列、第17列等8*i+1列;\b相当于键盘上的backspace键,它将会删除当前光标位置前的一个字符。但是,若当前光标前是一个\t,则将\t产生的空格一次性都删除。上机常见问题说明:说明1:输入输出整数时用格式控制符%d,单精度浮点数用%f,双精度浮点数%lf,且输入多个数据时,通过键盘输入时的分隔符要与两个%d或%f、%lf之间的分隔符一致.如scanf(%f,%f,&a,&b);printf(%f\n,a);输入时必须用英文状态下的逗号将两个数据分开,但对于scanf(%f%f,&a,&b);printf(%f\n,a);则输入时须用空格隔开。此外,注意scanf语句双引号内最好只有格式控制符,不要有汉字及
本文标题:程序设计基础第三章补充知识汇总
链接地址:https://www.777doc.com/doc-2238090 .html