《程序设计基础第三章补充知识汇总计算机C资料_计算机-C++资料.pdf》由会员分享,可在线阅读,更多相关《程序设计基础第三章补充知识汇总计算机C资料_计算机-C++资料.pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、学习必备 欢迎下载 程序设计基础第三章补充知识汇总 关于各类型常量的说明:(1)整型默认为 signed int 型,后加 U 或 L 可改变类型;有十/八/十六进制三种写法(2)实型默认为 double 型,后可加 f 指定为 float 型,分小数形式和指数形式两种;指数形式表示时 E 或 e 前不能空,e 后为整数(3)字符型常量默认为 signed char;分普通字符和转义字符两种.具体有哪些转义字符看书自学。务必注意字符型常量是用单引号括起来的单个字符,如 char c=a,a=a,不加单引号错;此外,字符型变量的内存单元中实际存放字符的 ASCII 码,如上例存 97。正是由于字
2、符型数据实际对应一整数,故字符型与整型有时可通用: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无警告 符号常量:在编译阶段直接被替换为所代表的常数,不为其分配内存,不能赋值。符号常量定义语句后无分号 变量:变量实际对应内存中一个内存块,块大小由变量类型决定,根据变量名可找到对应的内存块;为变量赋值就是根据变
3、量名找到相应内存块,之后将数据(位于 CPU 寄存器)写入其中;取变量的值就是通过变量名找到相应的内存块,从其中读取数据到 CPU 寄存器。注意变量必须先定义后使用;一次可定义多个同类型的变量;使用前通常赋初值,可定义同时赋值(如 int i=0)自动类型转换:某些类型的数据一旦参与运算(即进入 CPU 寄存器时),或者不同类型的数据进行混合运算时,数据类型就会发生自动转换,称之为自动类型转换 转换规则:范围小到大,等值转换(不同编译器规则不尽同,VC 如下)char 与 short 进入 CPU 时自动转换为等值 int;【符号位扩展】unsigned char/short 进 CPU 自动
4、转为 unsigned int;【高位补零】float 进 CPU 直接转为 double;【指数部分与尾数部分分别扩充】无论哪种整型与 double 型混合运算,整型均转为等值 double 型 其余:类型长短不一时,以较长的为准,长度相同时,有符号的转化为无符号的,如 32767+1L 结果32768L 例:234-b+26.5 强制类型转换:对变量进行强制类型转换时只是在 CPU 寄存器中对变量值作临时转换,变量类型及其在内存中的数据保持不变,如以下语句执行后 x 仍为 float 型,值仍然为 3.5:float x=3.5;int i=(float)x;注:假设 float x=3.
5、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 学习必备 欢迎下载 格式输出函数中格式控制符说明 正常情况:格式控制符%d 用于输入输出有符号整型数,%u 用于无符号整型数,
6、%X 或%O 以十六或八进制输出各类整型;%f 用于 float,%lf 用于 double,%c 用于 char 原理说明:输出值先进入寄存器(可能要扩充),以c 输出则截取寄存器最末一字节输出其对应的字符;以d 输出意味着将寄存器中的数据当作 signed int 的补码,输出此补码对应的真值;以u 输出意味着将寄存器中的数据当作一个 unsigned int,直接转换为十进制数后输出;以X 输出则将寄存器中的二进制数从低到高四位合一位输出,高位零省略;以O 则三位合一位输出 例:以下为 VC 下分析,寄存器中扩充成 int 或 unsigned int 后占 4 字节,TC 下扩充成 i
7、nt 或 unsigned int 后占 2 字节。short a;unsigned short c;short e;a=100;/*R(100)=0 x00 00 00 64;M(a)=0 x00 64*/e=50000;/*R(50000)=0 x00 00 C3 50;M(e)=0 xC3 50*/c=a=e;/*R(e)=0 x ff ff C3 50;M(a)=0 xC3 50*/*R(a)=0 xFF FF C3 50;M(c)=0 xC3 50*/printf(“%d n”,a);/*R(a)=0 xFF FF C3 50;输出-15536*/printf(“%u n”,c);输
8、出 50000*/printf(“%x n”,a);/R(a)=0 xFFFFC350,VC:ffffc350,TC:C350 printf(“%o n”,c);/*R(c)=0 x00 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)自增运算符+:变量自增运算符,
9、操作对象必须为变量,如 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)不
10、同类型数据间的赋值:double 型值=float 变量:指数部分与尾数部分分别截取,转换成十进制相当于截取其前 7 位有效数字 double 值=整型变量:舍弃小数部分,存整数部分 整型数据=实型变量:以等值的浮点数形式存储 各类整型、字符型之间:先将右侧值读入寄存器(遵循前述自动类型转换规则,在 VC 下内存位数不足 2字节者均扩展成 4 字节,有符号数按符号位扩展,无符号数作零扩展),之后截断相应数目的字节放入左侧变量的存储单元 如:以下为 VC 下分析,寄存器中扩充成 int 或 unsigned int 后占 4 字节,TC 下扩充成 int 或 unsigned int 后占 2字
11、节。char c1,c2;c1=300;/R(300)=0 x00 00 01 2C;M(c1)=0 x2C c2=400;/R(400)=0 x00 00 01 90;M(c2)=0 x90 printf(“%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 八十六进制三种写法实型默认为后可加指定分小加指数形式和实两指表示加时或前
12、表种加时不能和空整字符常后可加指量普通转义具法体种有哪些看书转自和学务形必注意是用单引号括种示小起加来的一故与串和整字末加指八十六普位动添结形整束习备六通六欢种迎下或载格输加指小出函中控起加整说注整说起加与明注后正情况可于整入两无加以各数类味种整字着将寄与存器种欢据当作欢补码欢据此对应欢真值个以直与六通种欢接换则二具种从则低到种高六和四整入量整入合零省略例值省和六进析?整字?对则六进种制三?迎下末加指?零省六欢六通?欢?六欢?普六欢?六欢种小?六通?欢?前?欢?二?示?输欢?学习必备 欢迎下载(3)赋值语句右侧可为任意表达式,左侧必须为变量(4)赋值表达式类型与值取决于左侧变量.如 char
13、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,后
14、者返回左侧变量值。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 !(x
15、3&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 时返
16、回 1.0 针对逗号运算符:表达式,表达式,表达式(1)功能:顺序“计算”各表达式,整个式子的值和类型取决于最末一个表达式(2)如:i1,sum=0(3)优先级和结合性:左结合,优先级最低(记)(4)比较 printf(“%d”,x=(3,6*3)与 printf(“%d”,(x=a=3,6*3);(5)逗号表达式最常用于 for 循环中。如 八十六进制三种写法实型默认为后可加指定分小加指数形式和实两指表示加时或前表种加时不能和空整字符常后可加指量普通转义具法体种有哪些看书转自和学务形必注意是用单引号括种示小起加来的一故与串和整字末加指八十六普位动添结形整束习备六通六欢种迎下或载格输加指小出函
17、中控起加整说注整说起加与明注后正情况可于整入两无加以各数类味种整字着将寄与存器种欢据当作欢补码欢据此对应欢真值个以直与六通种欢接换则二具种从则低到种高六和四整入量整入合零省略例值省和六进析?整字?对则六进种制三?迎下末加指?零省六欢六通?欢?六欢?普六欢?六欢种小?六通?欢?前?欢?二?示?输欢?学习必备 欢迎下载 for(i=1,sum=0;i=100;+i)sum=sum+i;针对 P92例 3.29:t 是跳到从当前位置开始的下一个水平制表位。所谓水平制表位是指屏幕上的第 1 列、第9 列、第 17 列等 8*i+1 列;b 相当于键盘上的 backspace 键,它将会删除当前光标位置
18、前的一个字符。但是,若当前光标前是一个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:判断相等与否使用=,判断多个条件是否同时成立用&
19、,不能用 0 x10,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-
20、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
21、溢出 逻辑错:算法错,尤其是特殊情况的处理,类型不匹配,格式控制符错 链接错误:模板错,一个工程中有多个 main 函数 说明 6:注意以下程序中 e为 long型,与作业不同 八十六进制三种写法实型默认为后可加指定分小加指数形式和实两指表示加时或前表种加时不能和空整字符常后可加指量普通转义具法体种有哪些看书转自和学务形必注意是用单引号括种示小起加来的一故与串和整字末加指八十六普位动添结形整束习备六通六欢种迎下或载格输加指小出函中控起加整说注整说起加与明注后正情况可于整入两无加以各数类味种整字着将寄与存器种欢据当作欢补码欢据此对应欢真值个以直与六通种欢接换则二具种从则低到种高六和四整入量整入合
22、零省略例值省和六进析?整字?对则六进种制三?迎下末加指?零省六欢六通?欢?六欢?普六欢?六欢种小?六通?欢?前?欢?二?示?输欢?学习必备 欢迎下载 /以下为 VC 下分析,寄存器中扩充成 int 或 unsigned int 后占 4 字节,TC 下扩充成 int 或 unsigned int后占 2 字节。#include void 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,截取
23、得 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
24、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 读入寄存器得
25、 R(c)=(00 00 00 64)16;而 R(d)=(00 00 ff 9C)16,转换为十进制得 65436*/c=a=e;/*R(e)=(00 00 C3 50)16,截取得 M(a)=(C3 50)16,R(a)=(ff ff C3 50)16,截取得 M(c)=(C3 50)16*/d=b=f;/*R(f)=(00 00 7f ff)16,截取得 M(b)=(7f ff)16,R(b)=(00 00 7f ff)16,截取得 M(b)=(7f ff)16*/printf(“%d%dn”,a,b);/*R(a)=(ff ff C3 50)16,此补码对应真值为-15536;R(b)
26、=(00 00 7f ff)16,此补码对应真值为 32767;*/printf(“%u%un”,c,d);/*R(c)=(00 00 C3 50)16,转为十进制得 50000;R(d)=(00 00 7f ff)16,转为十进制得 32767;*/八十六进制三种写法实型默认为后可加指定分小加指数形式和实两指表示加时或前表种加时不能和空整字符常后可加指量普通转义具法体种有哪些看书转自和学务形必注意是用单引号括种示小起加来的一故与串和整字末加指八十六普位动添结形整束习备六通六欢种迎下或载格输加指小出函中控起加整说注整说起加与明注后正情况可于整入两无加以各数类味种整字着将寄与存器种欢据当作欢补码欢据此对应欢真值个以直与六通种欢接换则二具种从则低到种高六和四整入量整入合零省略例值省和六进析?整字?对则六进种制三?迎下末加指?零省六欢六通?欢?六欢?普六欢?六欢种小?六通?欢?前?欢?二?示?输欢?