程序设计基础第三章补充知识汇总_第1页
程序设计基础第三章补充知识汇总_第2页
程序设计基础第三章补充知识汇总_第3页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、程序设计基础第三章补充知识汇总关于各类型常量的说明:整型默认为signed int型后加U或L可改变类型;有十/八/十六进制三种写法实型默认为double型,后可加f指定为float型,分小数形式和指数形式两种;指数形式表示时E或e前不能空,e后为整数(3) 字符型常量默认为 sig ned char;分普通字符和转义字符两种 具体有哪些转义字符看书自学。务必注意字符型常量是用单引号括起来的单个字符,如char c=' a'a= a'不加单引号错;此外,字符型变量的内存单元中实际存放字符的ASCII码,如上例存97。正是由于字符型数据实际对应一整数,故字符型与整型有时可

2、通用:int i=;'ch'arc=97;i nt j=-32;'char b=c-32;(4) 字符串常量是”括起来的串,末位自动添加结束符0'务必区分AC” A”-32768U与-32768在寄存器中存储结构一样,均为FF FF 80 00。区别在于,设有Un sig ned x;则x=-32768会有警告,而x=-32768U无警告符号常量:在编译阶段直接被替换为所代表的常数,不为其分配内存,不能赋值。符号常量定义语句后无分号变量:变量实际对应内存中一个内存块,块大小由变量类型决定,根据变量名可找到对应的内存块;为变量赋值就是根据变量名找到相应内存块,之后

3、将数据(位于CPU寄存器)写入其中;取变量的值就是通过变量名找到相应的内存块,从其中读取数据到CPU寄存器。注意变量必须先定义后使用;一次可定义多个同类型的变量;使用前通常赋初值,可定义同时赋值(如int i=0)自动类型转换:某些类型的数据一旦参与运算(即进入CPU寄存器时),或者不同类型的数据进行混合运算时,数据类型就会发生自动转换,称之为自动类型转换转换规则:范围小到大,等值转换(不同编译器规则不尽同,VC如下)char与short进入CPU时自动转换为等值int;【符号位扩展】 unsigned char/short进 CPU 自动转为 unsigned int;【高位补零】 floa

4、t进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,y=3.5;则(int)x+y 为实数值 6.5;

5、而(int)(x+y)值为 7#include vstdio.h>void main()printf("%dn",(int)3.5); printf("%dn",(int)-3.5); printf("%lfn",(double)3); printf("%lfn",(double)-3);printf(“ 1” ,5/3);不匹配,故结果错printf("%lfn",(double)5/3);/注:printf(“ 括,1输出 0.000000格式输出函数中格式控制符说明正常情况:格式控制

6、符 %d用于输入输出有符号整型数,u用于无符号整型数,%X或0以十六或八进制输出各类整型; f用于float,%lf用于double, %c用于char原理说明:输出值先进入寄存器(可能要扩充),以 c输出则截取寄存器最末一字节输出其对应的字符;以 d输出意味着将寄存器中的数据当作signed int的补码,输出此补码对应的真值;以 u输出意味着将寄存器中的数据当作一个unsigned int,直接转换为十进制数后输出;以X输出则将寄存器中的二进制数从低到高四位合一位输出,高位零省略;以0则三位合一位输出占2字节。例:以下为 VC下分析,寄存器中扩充成int或unsigned int后占4字节

7、,TC下扩充成int或unsigned int后short a; un sig ned 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(“r%d,a);/*R(a)= 0xFF FF C3 50 ;输出-15536*/printf(“ ”,c);输出 5

8、0000*/printf(“r%x ,a);R(a)=0xFFFFC350,VC:ffffc350, TC:C350printf(“ ” ,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自增运算符+:变量自增运算符 操作对象必须为变量,

9、如x+或+x,但(x+y)+错。x+是先将变量的值读入寄 存器参与运算,当前语句结束后再将内存中x的值增1 ; +x是将内存中变量值增 1,之后再读入运算器参与运算。简单说就是x+是先使用后自增;而+x是先增1后使用(4)自减运算符-:类似自增运算符,只是变量减1运算符+ -均单目运算符,优先级高于其它算术运算符,且均为右结合。如i=3;j=-i+;相当于j=-(i+); 针对赋值运算符:(1) 赋值运算符:简单赋值运算符=;复合赋值运算符 += *=女口: x=3; x+=3相当x=x+3;x%=y+3相当x=x%(y+3),其它如-=/=等依此类推(2) 不同类型数据间的赋值: doubl

10、e型值=>float变量:指数部分与尾数部分分别截取,转换成十进制相当于截取其前7位有效数字 double值=> 整型变量:舍弃小数部分,存整数部分 整型数据=>实型变量:以等值的浮点数形式存储 各类整型、字符型之间:先将右侧值读入寄存器(遵循前述自动类型转换规则,在VC下内存位数不足 2字节者均扩展成4字节,有符号数按符号位扩展,无符号数作零扩展),之后截断相应数目的字节放入左侧变量的存储单元女口:以下为 VC下分析,寄存器中扩充成int或unsigned int后占4字节,TC下扩充成int或unsigned int后占2 字节。char c1, c2;c仁300;/R(

11、300)=0x00 00 01 2C;M(c1)=0x2Cc2=400;/R(400)=0x00 00 01 90;M(c2)=0x90printf( “ %cn”,c1,c2);/R(c1)=00 00 00 2c,/R(c2)=ff ff ff 90 '%dn” ,c1, c2); /R(c2)=ff ff ff 90 ;);截取末字节,VC输出,?; TC输出,eprintf(/ R(c1)=00 00 00 2c,;分别是44和-112补码,输出 44与-112(3) 赋值语句右侧可为任意表达式,左侧必须为变量赋值表达式类型与值取决于左侧变量女口 char c; printf(

12、 %d ”,c=400);显示144.赋值表达式可作变量用,相当于左侧变量,如(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 ”=3);合法,而printf( %d ”=3;);不合法针对关系运算符 ::<<=> >=!=格式: 3>0x>0 i= =0 x!=y(1)关系运算成立时结果为1,不成立时结果为0。=是判断相等,=是赋值,前者返回0或

13、1,后者返回左侧变量值。 真。如if(i=0)pri ntf(if(i=0)pri ntf(if(i=1)pri ntf(if(i=1)pri ntf(C语言中判断一个量时认为零为假,非零为"never executable! ” );“ executable if i equals zero!“ always executable! ” );“ executable if i equals one!”)(3) :左结合,优先级整体上低于算术运算符,高于赋值运算符。内部而言,=和!=低于其它 < <=等其它关系运算符针对P82逻辑运算符:!(逻辑非)&&(

14、逻辑与)|(逻辑或)(1) 格式:如 x<0&&y<0x<0|y<0!(x<0)(2) 运算依据:成立则表达式值1,否则值为0(3) 结合性与优先级:左结合,!与单目算术运算符双目算术运算符关系运算符&&|赋值运算符(4) 逻辑表达式:用逻辑运算符将表达式连接起来的式子。注意C语言中只要值非零就认为是真,零就认为是假举例:a=4,b=5,c=6 时:!a值为0 a&&b值为1a|b值为1!a|b 值为 1 4&&0|2 值为 15>3&&8<4-!0 值为 0!(a<

15、b) && x>y;a<b&&a<c|a<0;(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=a>b)&&(n=c>d)后,m 的值为 0, 而 n 的值仍为 1。针对P83条件运算符:表达式1?表达式2:表达式3(1)

16、功能:表达式1成立吗(非零),成立则结果为表达式2的值,否则结果为表达式1的值(2) 女口: max=a>b?a:b;或 min=a<b?a:b;(3) 优先级:条件运算符优先级仅比赋值运算符高结合方向:自右至左,同赋值运算符和单目运算符,如a>b?a:c>d?c:d理解为a>b?a:(c>d?c:d)(5) 条件表达式还可是赋值表达式或函数表达式,如:x>0?y=x:y=_x;x>0?printf( “%d” ,y=x):printf( “ d" ,y=-x);三个表达式的类型可不同,表达式类型为后两个表达式中较高者,如x>y?

17、1:1.5 ;当x>y时返回1.0针对逗号运算符:表达式1,表达式2,,表达式n(1) 功能:顺序“计算”各表达式,整个式子的值和类型取决于最末一个表达式(2) 如:i= 1, sum=0(3) 优先级和结合性:左结合,优先级最低(记)printf(“ d' ,(x=a=3,6*3);比较 printf(“ d' a,x=(3, 6*3)与(5) 逗号表达式最常用于for循环中。如for(i=1,sum=0; i<=100; +i)sum=sum+i;针对P92例3.29: t是跳到从当前位置开始的下一个水平制表位。所谓水平制表位是指屏幕上的第1列、第9列、第17列

18、等8*i+1列;b相当于键盘上的backspace键,它将会删除当前光标位置前的一个字符。但是,若 当前光标前是一个t,则将t产生的空格一次性都删除。上机常见问题说明:说明1:输入输出整数时用格式控制符d,单精度浮点数用 %f,双精度浮点数lf,且输入多个数据时,通过键盘输入时的分隔符要与两个%d或%f、%lf之间的分隔符一致.如sca nf("%f,%f",&a,&b);pri ntf("%fn",a);输入时必须用英文状态下的逗号将两个数据分开,但对于sca nf("%f%f",&a,&b);pri

19、 ntf("%fn",a);则输入时须用空格隔开。此外,注意scanf语句双引号内最好只有格式控制符,不要有汉字及n说明2 :判断相等与否使用=,判断多个条件是否同时成立用&&,不能用0<x<10,if(x=0&&y !=0) pri ntf("ok");else prin tf("error!");说明3:花括号的使用:将多条语句看作一个整体,只有一条语句时可不用if(.)while(.)dowhile(m% n!=0) else 5说明4: %15.6f代表输出一个浮点数,小数部分占6位

20、,小数部分与整数部分及 小数点总共占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位。如以

21、-6.2的格式输出5.329则得到5.33;说明5: error:丢分号、括号和引号,标点或大小写错,变量未定义,缺头文件warning:变量使用前未赋初值,赋值类型不匹配,变量定义后未用运行错:越界访问(丢&) 除0溢出逻辑错:算法错,尤其是特殊情况的处理,类型不匹配,格式控制符错链接错误:模板错,一个工程中有多个main函数说明6:注意以下程序中e为long型,与作业不同以下为VC下分析,寄存器中扩充成int或unsigned int后占4字节,TC下扩充成int或unsigned int 后占2字节。#i nclude<stdio.h>void mai n()shor

22、t a,b;un sig ned short c,d;long e,f;a=100;/*R(100)=(00 00 00 64) 16,截取得 M(a)=(00 64)佃*/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)佃*/c=a;/*先将a读入寄存器得 R(a)= (00 00 00 64)假 后截取得 M(c)= (00 64)佃*/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

温馨提示

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

评论

0/150

提交评论