程序设计基础补充知识汇总.doc_第1页
程序设计基础补充知识汇总.doc_第2页
程序设计基础补充知识汇总.doc_第3页
程序设计基础补充知识汇总.doc_第4页
程序设计基础补充知识汇总.doc_第5页
全文预览已结束

下载本文档

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

文档简介

程序设计基础第三章补充知识汇总 关于各类型常量的说明:(1)整型默认为signed int型,后加U或L可改变类型;有十/八/十六进制三种写法(2)实型默认为double型,后可加f指定为float型,分小数形式和指数形式两种;指数形式表示时E或e前不能空,e后为整数(3)字符型常量默认为signed char;分普通字符和转义字符两种.具体有哪些转义字符看书自学。务必注意字符型常量是用单引号括起来的单个字符,如char c=a,a=a,不加单引号错;此外,字符型变量的内存单元中实际存放字符的ASCII码,如上例存97。正是由于字符型数据实际对应一整数,故字符型与整型有时可通用:int i=a;char c=97;int j=a-32; char b=c-32;(4)字符串常量是”括起来的串,末位自动添加结束符0,务必区分A与”A”(5) -32768U与-32768在寄存器中存储结构一样,均为FF FF 80 00。区别在于,设有Unsigned x;则x=-32768会有警告,而x=-32768U无警告 符号常量:在编译阶段直接被替换为所代表的常数,不为其分配内存,不能赋值。符号常量定义语句后无分号 变量:变量实际对应内存中一个内存块,块大小由变量类型决定,根据变量名可找到对应的内存块;为变量赋值就是根据变量名找到相应内存块,之后将数据(位于CPU寄存器)写入其中;取变量的值就是通过变量名找到相应的内存块,从其中读取数据到CPU寄存器。注意变量必须先定义后使用; 一次可定义多个同类型的变量;使用前通常赋初值,可定义同时赋值(如int i=0) 自动类型转换:某些类型的数据一旦参与运算(即进入CPU寄存器时),或者不同类型的数据进行混合运算时,数据类型就会发生自动转换,称之为自动类型转换转换规则:范围小到大,等值转换(不同编译器规则不尽同,VC如下)p char与short进入CPU时自动转换为等值int;【符号位扩展】p unsigned char/short进CPU自动转为unsigned int;【高位补零】p float进CPU直接转为double;【指数部分与尾数部分分别扩充】p 无论哪种整型与double型混合运算,整型均转为等值double型p 其余:类型长短不一时,以较长的为准,长度相同时,有符号的转化为无符号的,如32767+1L结果32768Lp 例:234-b+26.5 强制类型转换:对变量进行强制类型转换时只是在CPU寄存器中对变量值作临时转换,变量类型及其在内存中的数据保持不变,如以下语句执行后x仍为float型,值仍然为3.5:float x=3.5; int i=(float)x;注:假设float x=3.5,y=3.5;则(int)x+y为实数值6.5;而(int)(x+y)值为7#include void main()printf(%dn,(int)3.5);printf(%dn,(int)-3.5);printf(%lfn,(double)3);printf(%lfn,(double)-3);printf(“%lfn”,5/3);/不匹配,故结果错printf(%lfn,(double)5/3);/注:printf(“%lfn”,1)输出0.000000 格式输出函数中格式控制符说明p 正常情况:格式控制符%d用于输入输出有符号整型数,%u用于无符号整型数, %X或%O以十六或八进制输出各类整型;%f用于float,%lf用于double, %c用于charp 原理说明:输出值先进入寄存器(可能要扩充),以c输出则截取寄存器最末一字节输出其对应的字符;以d输出意味着将寄存器中的数据当作signed int的补码,输出此补码对应的真值;以u输出意味着将寄存器中的数据当作一个unsigned int,直接转换为十进制数后输出;以X输出则将寄存器中的二进制数从低到高四位合一位输出,高位零省略;以O则三位合一位输出p 例:以下为VC下分析, 寄存器中扩充成int或unsigned int后占4字节,TC下扩充成int或unsigned int后占2字节。 short a; unsigned short c; short e;a=100; /*R(100)=0x00 00 00 64; M(a)=0x00 64*/e=50000; /*R(50000)=0x00 00 C3 50; M(e)=0xC3 50*/c=a=e; /*R(e)=0x ff ff C3 50;M(a)=0xC3 50*/*R(a)=0xFF FF C3 50;M(c)=0xC3 50*/printf(“%dn”,a); /*R(a)= 0xFF FF C3 50;输出-15536*/printf(“%u n”,c); 输出50000*/printf(“%xn”,a);/R(a)=0xFFFFC350,VC:ffffc350,TC:C350printf(“%o n”,c); /*R(c)=0x00 00 C3 50; 输出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或unsigned int后占4字节,TC下扩充成int或unsigned int后占2字节。char c1, c2;c1=300; /R(300)=0x00 00 01 2C;M(c1)=0x2Cc2=400; /R(400)=0x00 00 01 90;M(c2)=0x90printf(“%c %cn”, c1,c2); /R(c1)=00 00 00 2c, /R(c2)=ff ff ff 90;截取末字节,VC输出, ?;TC输出, printf(“%d %dn”,c1, c2); / R(c1)=00 00 00 2c, /R(c2)=ff ff ff 90;分别是44和-112补码,输出44与-112(3)赋值语句右侧可为任意表达式,左侧必须为变量(4)赋值表达式类型与值取决于左侧变量.如 char c; printf(“%d”,c=400);显示144. (5)赋值表达式可作变量用,相当于左侧变量,如 (a=3*5)=4*6可, a=3*5=4*6错(6)赋值语句具有右结合性。优先级比常见运算符都低 char c; 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;);不合法 针对关系运算符:: = = !=格式: 30 x0 i= =0 x!=y(1)关系运算成立时结果为1,不成立时结果为0。(2) =是判断相等, =是赋值,前者返回0或1,后者返回左侧变量值。C语言中判断一个量时认为零为假,非零为真。如if(i=0)printf(“never executable!”);if(i=0)printf(“executable if i equals zero!”) if(i=1)printf(“always executable!”); if(i=1)printf(“executable if i equals one!”)(3):左结合,优先级整体上低于算术运算符,高于赋值运算符。内部而言,=和!=低于其它 =等其它关系运算符 针对P82逻辑运算符:!(逻辑非) &(逻辑与) |(逻辑或)(1)格式:如x0&y0 x0|y0 !(x3&84-!0 值为0!(ay; ab&ac|ab)&(n=cd)后,m的值为0,而n的值仍为1。 针对P83条件运算符:表达式?表达式表达式(1)功能:表达式1成立吗(非零),成立则结果为表达式2的值,否则结果为表达式1的值(2)如:max=ab?a:b; 或 min=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)如:i1,sum=0(3)优先级和结合性:左结合,优先级最低(记)(4)比较 printf(“%d”,x=(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(%fn,a);输入时必须用英文状态下的逗号将两个数据分开,但对于 scanf(%f%f,&a,&b);printf(%fn,a);则输入时须用空格隔开。此外,注意scanf语句双引号内最好只有格式控制符,不要有汉字及n说明2:判断相等与否使用=,判断多个条件是否同时成立用&,不能用0x10, if(x=0&y!=0) printf(ok);else printf(error!);说明3:花括号的使用:将多条语句看作一个整体,只有一条语句时可不用 if(.) while(.) do .; .; .; .; .; .; while(m%n!=0) else .; 说明4:%15.6f代表输出一个浮点数,小数部分占6位,小数部分与整数部分及小数点总共占15位(如果是负数的话,负号也计算在内)。小数部分不够6位时补零,多于6位时四舍五入取6位;整数部分不够(15-6-1)位时左侧补空格,(15代表列宽,6代表小数,1代表小数点,如果是负数,则应为15-6-1-1),整数部分多于(15-6-1)位时则15不起作用,小数部分还是6位,但整数部分有多少位就输出多少。如以6.2的格式输出5.329则得到5.33;以6.2的格式输出12345.329则得到12345.33;%-15.6f与%15.6f的区别在于,后者是在左侧补空格直到满15位,即数字右对齐;而前者是在右侧补空格,直到满15位。如以-6.2的格式输出5.329则得到5.33;说明5:error:丢分号、括号和引号,标点或大小写错,变量未定义,缺头文件warning:变量使用前未赋初值,赋值类型不匹配,变量定义后未用运行错:越界访问(丢&) 除0溢出逻辑错:算法错, 尤其是特殊情况的处理,类型不匹配,格式控制符错链接错误:模板错,一个工程中有多个main函数说明6:注意以下程序中e为long型,与作业不同 /以下为VC下分析, 寄存器中扩充成int或unsigned int后占4字节,TC下扩充成int或unsigned int后占2字节。 #includevoid main()short a,b;unsigned short c,d;long e,f;a=100; /*R(100)=(00 00 00 64)16,截取得M(a)=(00 64)16*/b=-100 /*R(-100)=(ff ff ff 9C)16,截取得M(b)=(ff 9C)16*/e=50000 /*R(50000)=(00 00 C3 50)16,得M(e)=(00 00 C3 50)16*/f=32767; /* R(32767)=(00 00 7f ff)16,得M(f)=(00 00 7f ff)16*/c=a; /*先将a读入寄存器得R(a)= (00 00 00 64)16,后截取得M(c)= (00 64)16*/d=b; /*先将b读入寄存器得R(b)= (ff ff ff 9C)16,后截取得M(d)= (ff 9C)16*/printf(“%d,%dn”,a,b);/* 先将a读入寄存器得R(a)= (00 00 00 64)16,这是100的补码;同样,将b读入寄存器得R(b)= (ff ff ff 9C)16,这是-100的补码*/ printf(“%u,%un”,a,b);/* 先将a读入寄存器得R(a)= (00 00 00 64)16,以u输出意味着将寄存器中的数据当作一个无符号的二进制数,将其直接转换为十进制数后输出,(00 00 00 64)16按位权展开求和后得100;而R(b)= (ff ff ff 9C)16,转换为十进制得4294967196*/printf(“%u,%un”,c,d);/* 注意c与d为无符号变量,读入寄存器时扩充零,将c读入寄

温馨提示

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

最新文档

评论

0/150

提交评论