- 204.50 KB
- 2022-08-11 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
第2章C语言基础北京科技大学计算机系C语言程序设计1\n本章主要内容本章介绍C语言的基础,包括:数据类型运算符和表达式均是程序设计的基本知识为什么讨论这些知识?通常程序要对数据进行操作处理:处理的对象是数据通过运算符和表达式进行操作2\n例如:【例2.1】计算圆的面积,半径为5cm。程序如下:main(){floatr,area;r=5;area=3.14*r*r;printf("%f\n",area);}运算结果是输出圆的面积:78.500000程序中用到的数据:r、area、5、3.14对数据进行的运算:*、=例jc2_13\n分析:计算机操作处理时,要完成以下工作:在内存中给半径r和运算结果area开辟存储空间,存放它们的值。应该留多大的地方来存放它们的值?数据5和3.14与r、area不同,它们是在编写程序时就给出确定的值,在运算过程中不会改变。这样的数计算机怎么处理?对整数5和小数3.14,计算机存放时是否有区别?涉及数据类型的基本知识4\nC语言的数据类型C数据类型数组类型结构体类型共用体类型枚举类型整型字符型实型(浮点型)空类型单精度型双精度型基本类型指针类型构造类型本章讨论基本类型数据5\n2.1.1整型数据1.整型数据的类型基本整型数据int,分配2Byte短整型数据shortint,分配2Byte长整型数据longint,分配4Byte整型数据均以二进制补码形式存储问题:为什么要采用补码?如何表示?6\n计算机中正、负数的表示例如:109=(1101101)2要区别:+109和-109方法是:将符号也数码化即:正的符号+用0表示负的符号-用1表示∴计算机中的数表示方法是:符号位+二进制数值(以8bit为例)+109→+1101101→01101101-109→-1101101→111011017\n问题:计算机计算复杂化例如计算:(-19)+(+22)10010011+00010110解决的方法是:使用反码或补码的表示方法(按前述表示的编码称为原码),即能将减法一律转换为加法。需要判断符号是否相同:如果相同,结果符号不变,并进行绝对值相加如果不同,结果取绝对值大的数的符号,并进行绝对值相减8\n原码、反码和补码正数:原码、反码、补码相同符号位为0,数值为对应的二进制数。+109[01101101]原=[01101101]反=[01101101]补负数:原码符号位为1,数值为绝对值的二进制数。-109[11101101]原反码符号位为1,数值为绝对值的二进制数各位变反。-109[10010010]反补码符号位为1,数值为绝对值的二进制数各位变反加1。-109[10010011]补9\n2.有符号和无符号整型数据有符号的整型数据signedint无符号的整型数据unsignedint区别是将最高位看作符号位还是数据位例如:1111111110101000作为有符号数使用时,最高为符号位为负数,值是:-88(再求一次补)作为无符号数使用时,最高为数据位为无符号的数,值是:6544810\n例如:main(){unsignedintm;m=65448;printf("\nm=%d\n",m);printf("m=%u\n",m);}例jc2_a输出结果:m=-88m=65448按有符号数输出按无符号数输出11\n整型数据的类型及规定方括号表示可选项int分配2Byte,long分配4Byte类型名称类型符bit取值范围整型(短整型)[signed]int[signed]short[int]16215~215-1(-32768~32767)无符号整型unsigned[int]160~216-1(0~65535)长整型[signed]long[int]32-231~231-1无符号长整型unsignedlong[int]320~232-112\n2.1.2实型数据1.实型数据的类型单精度实型数据float,分配4Byte双精度实型数据double,分配8Byte2.实型数据的存储单精度实型指数部分小数部分小数的符号位指数的符号位13\n实型数据的类型及规定C标准并未具体规定各种实型数据所占字节数,也不规定具体小数和指数部分的位数。一般而言,小数部分位数多,数据表示的有效数字多,精度就高;而指数部分位数多,则表示的数据范围更大。有效数字的意义?类型类型符Byte绝对值的范围有效数字单精度型float410-37~10387~8位双精度型double810-307~1030815~16位例jC2_a14\n2.1.3字符型数据字符型数据char,分配1Byte字符型数据是指字母、数字、各种符号等用ASCII值表示的字符例如'a'是一个char类型数据,称作字符常量,存储:011000012.1.4空类型空类型void通常与指针或函数结合使用15\n2.2常量、变量与标准函数主要内容:常量变量标准库函数16\n2.2.1常量在运行程序的过程中值保持不变的量1.整型常量十进制:0~9八进制:0~7,以0开头十六进制:0~9,A~F/a~f,以0x或0X开头例如:100-80+12301002401000730x380x100X100XFF0x0a17\n1.整型常量整型常量的类型:根据值大小默认类型。整型常量后面加l或L,则认为是longint型例如:123L、0L、432l、0x100l注意:十六进制常量中可以使用大写字母A~F,也可以使用小写字母a~f。八进制常量中不能出现数字8或9例如:018、0921非法18\n2.实型常量十进制形式1.01.+12.0-12.00.0指数形式1e31.8e-3-123E-6-.1E-3等价于:1×1031.8×10-3-123×10-6-0.1×10-3指数只能是整数,而尾数则可以是整数也可以是小数,无论指数或尾数均不能省略例如:1e、E.5、E-3非法实型常量的类型:默认为double型,后面加F(或f),则强调表示该数是float类型例如:3.5f、1e2F19\n3.字符型常量可视字符常量单引号括起来的单个可视字符例如:'a'、'A'、'+'、'3'、''等转义字符常量单引号括起来的\与可视字符组合,例如:\0字符串结束标志\n回车换行\t跳到下一个输出位置\"双引号字符\dddddd为1到3位八进制数所代表的字符\xhhhh为1到2位十六进制数所代表的字符20\n4.字符串常量用双引号括起的一个字符序列例如:"ABC"、"123"、"a"、"\n\t""\nGoodmorning"字符串常量的长度:所包含的字符个数字符串常量的存储方式:\nGoodmorning\0a\0所占存储单元数:串长度+1例如:字符串结束标记21\n5.符号常量以标识符来代表的常量事先编译预处理命令define定义编译时先由系统替换为它所代表的常量,再进行编译例如:#defineLEN2.5main(){floata,b;a=2*3.14*LEN;b=3.14*LEN*LEN;printf("a=%f,b=%f\n",a,b);}定义符号常量使用符号常量编译前系统进行替换22\n5.符号常量main(){floata,b;a=2*3.14*2.5;b=3.14*2.5*2.5;printf("a=%f,b=%f\n",a,b);}define是编译预处理命令,必须以“#”开头编译预处理命令在第7章讨论。替换为23\n2.2.2变量1.变量的有关概念在程序运行过程中,其值改变的数据,称为变量,变量用标识符表示,称为变量名。变量必须“先定义后使用”系统为变量分配存储单元,存储变量的值。编写程序时通过变量名来存、取变量值。a510变量值为变量分配的存储单元变量名例如:有变量a它的值是51024\n2.变量定义变量定义的一般格式:数据类型说明符变量列表;例如:inti,j;longk,m;floatx,y;charch1,ch2;必须使用合法的标识符作变量名不能使用关键字为变量命名25\n3.变量的初始化:允许在说明变量的时候对变量赋初值。例如:inta=5,b=10+2;doublex=23.568,y;charch1='a',ch2=66,ch3='\142';表示定义变量并对变量存储单元赋值。错误的初始化:inta=3+b,b=5;floatm=n=23.16;26\n2.2.3标准库函数由C编译系统定义的一种函数,存放在系统函数库中,用户可以根据需要随时调用常用函数如:printf、scanf、fabs、sqrt、sin、(常用数学函数参见教材P30表2.5)函数调用形式:函数名([参数表])例如:putchar('a')sqrt(x)例jc2_327\n2.3运算符和表达式主要内容:算术运算符和算术表达式赋值运算符和赋值表达式关系运算符和关系表达式逻辑运算符和逻辑表达式位运算符和位运算表达式条件运算符和条件表达式逗号运算符和逗号表达式其他运算符及其运算28\n运算符的有关概念作用:对运算对象完成规定的操作运算类型:按运算对象分:单目、双目、三目按功能分:算术、赋值、关系、逻辑条件、逗号、位、其他29\n运算符的优先级和结合性优先级指各种运算符号的运算优先顺序例如:算术运算优先于关系运算算术运算中先*/后+-结合性指运算符号和运算对象的结合方向分为:从左向右(左结合)和从右向左(右结合)例如:算术运算符为左结合a-b+4赋值运算符为右结合a=b=5(C语言规定见教材P297附录B)30\n本章涉及的运算符+-*/%++--+-=+=-=*=/=%=&=|=^=>>=<<=><>=<===!=&&||!&|^~<<>>?:,&sizeof(数据类型标识符)类型种类算术运算符赋值运算符关系运算符逻辑运算符位运算符条件运算符逗号运算符其他运算符31\n表达式的有关概念什么是表达式由运算符将运算对象连接成的式子,它描述了一个具体的求值运算过程。计算表达式的值按照运算符的运算规则求值求值时注意运算符的优先级和结合性表达式值的类型自动转换强制转换32\n例如:表达式:150+'b'*2-12.456b=(++a)-2a/=a*=(a=2)f=a>b>c--a||++b&&c++max=a>b?a:ba=3,a+=3,a*a1/(float)a+633\n算术运算算术运算符的优先级()+-++--*/%+-同级同级同级单目双目高低没有乘方运算符,要计算a3要写作a*a*a的连乘,或用标准库函数pow(a,3)“/”的运算对象可为各种类型数据,但是当进行两个整型数据相除时,运算结果也是整型数据“%”要求运算对象必须是整型数据,功能是求两数相除的余数,余数的符号与被除数的符号相同。34\n自增自减运算++--是单目运算符有前缀和后缀两种形式前缀形式:先自增(自减)再引用;后缀形式:先引用再自增(自减);功能:前缀形式++a等价于a=a+1--a等价于a=a–1后缀形式a++等价于a=a+1a--等价于a=a–1表达式的值会不同35\n例如:当a=5时⑴++a表达式的值为6,且a=6⑵a++表达式的值为5,且a=6⑶b=++a等价于a=a+1;b=a表达式的值为6,且a=6,b=6⑷b=a++等价于b=a;a=a+1表达式的值为5,且a=6,b=536\n说明:++和--的运算对象只能是变量(或运算结果是变量的表达式),不能是常量(或运算结果是数值的表达式)。例如:5++、(a+2)++不合法。具有右结合性,结合方向为从右到左。例如:–a++等价于-(a++)如果有多个运算符连续出现时,C系统尽可能多的从左到右将字符组合成一个运算符例如:i+++j等价于(i++)+j-i+++-j等价于-(i++)+(-j)37\nmain(){inta=5;printf("%d%d\n",a,a++);}说明(续):对函数参数的求值顺序:TurboC系统先计算最右边的参数值,再依次计算左面的参数值。【例2.5】有多个函数参数且为同一变量自增的运算处理。输出结果:65运行例2.538\n说明(续):【例2.6】有多个函数参数且为同一变量多次自增的运算处理。main(){inta=5;printf("%d%d\n",a,(a++)+(a++));}输出结果:711运行例2.639\n赋值运算赋值运算符(右结合)=+=-=*=/=%=&=|=^=>>=<<=赋值表达式将表达式的值存入变量对应的内存单元中m=12b=(++a)-2m%=3+n等价于m=m%(3+n)x*=(x=5)40\n说明:赋值号左边必须是变量,右边可以是C语言任意合法的表达式例如:n=t+210等价于:a=(b=((b*c)>10))赋值号与数学中的等号含义不同例如:数学中a=b等价于b=aC语言中a=b不等价于b=a41\n关系运算关系运算符(左结合)>>=<<===!=较高较低关系表达式用关系运算符将运算对象连接成的式子例如:12<'C'+1(字符型数据比较ASCII值)a==b>=c等价于a==(b>=c)与(a==b)>=c不等价关系运算符优先于赋值,低于算术42\n说明:关系运算的结果应该是逻辑值。C语言用数值用1表示逻辑真,0表示逻辑假例如:7>5的值是1,5>7的值是0'a'>'b'的值是0,'a'<'b'的值是1即关系表达式的值:0或1实型数可进行大于或小于比较,但通常不进行==或!=的关系运算43\n逻辑运算符逻辑运算符&&||!逻辑运算符的运算规则运算对象逻辑运算结果aba&&ba||b!a非0非0110非000100非00110000144\n逻辑表达式逻辑表达式用逻辑运算符将运算对象连接成的式子例如:0&&'b'a&&b||c&&da||b-5||c/4!x+y>=z逻辑运算符的优先级和结合性:!是单目运算符,右结合,高于算术&&和||是双目运算符,左结合,高于赋值运算符,低于关系运算符45\n逻辑运算规则从左到右依次进行逻辑计算运算对象为非0表示逻辑真运算对象为0表示逻辑假逻辑运算的结果为0或1例如设:a=15,b=0,c=-2a&&b&&c结果为0a||b||c结果为1(a+c)||b&&c结果为146\n逻辑运算规则(续)运算按照从左至右的顺序进行,一旦能够确定逻辑表达式的值,就立即结束运算——逻辑运算的短路性质例如设:a=1,b=0,c=-2a&&b&&c(a++)||++b&&--c为0,运算终止,表达式值为0为非0,运算终止,表达式值为1且a为2,b为0,c为-2(b,c保持原值)47\n关系与逻辑运算符的应用表示数学公式a>b>c判断a,b,c三条线段能否组成一个三角形a,b不同时为负a+b>c&&a+c>b&&b+c>aa>=0||b>=0!(a<0&&b<0)(a<0&&b>=0)||(a>=0&&b<0)||(a>=0&&b>=0)a>b&&b>c48\n位运算符~&^|<<>>位逻辑运算符移位运算符单目位运算符的运算对象只能是整型数据或字符型数据,不能是实型数据运算对象一律按二进制补码参加运算,并按位进行运算位运算的结果是一个整型数据低于单目、算术运算符,高于其他运算符低于单目、算术和关系运算符,高于其他运算符49\n位逻辑运算符的运算规则假设ai和bi均是一个二进制位(bit)运算对象逻辑运算结果aibiai&biai|biai^bi˜ai000001010111100110111100例如:假设a=10,b=010求a&b、a|b、a^b、˜a50\n程序如下:main(){inta=10,b=010;printf("%d%d\n",a&b,a|b);printf("%d%d\n",a^b,~a);}输出结果:8102-110000000000001010&00000000000010000000000000001000即:a&b的值是80000000000001010˜1111111111110101即:˜a的值是-11运行jc2_b51\n移位运算例如:a<>b-1等价于(a+8)>>(b-1)例如:假设a=10,b=2,求a<>b-1main(){inta=10,b=2;printf("%d%d\n",a<>b-1);}输出结果:409运行jc2_c请自行分析运行结果52\n条件表达式运算条件运算符:?:条件表达式的一般形式表达式1?表达式2:表达式3例如:m=10&&b-->20?a:bx=3+a>5?100:200C语言中唯一的三目运算符,要正确区分用?和:分隔的表达式涉及条件运算符的优先级与结合性53\n条件运算符优先级条件运算符优先级高于赋值、逗号运算符,低于其他运算符例如:⑴m=10&&b-->20?a:b⑶x=3+a>5?100:200等价于:(m=10&&b-->20)?a:b等价于:x=((3+a>5)?100:200)54\n条件运算符的结合性条件运算符具有右结合性当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。例如:w=<整型表达式>小数部分自动补0<整型变量>=<实型表达式>自动舍去实型表达式的小数部分(注意不进行四舍五入)<字符变量>=<整型表达式><整型变量>=<长整型表达式>自动截取表达式值的低字节赋值,舍去高字节<整型变量>=<字符数据><长整型变量>=<整型表达式>自动给高字节补0或补160\n2.4.2数据类型的强制转换强制转换的一般形式(类型名)表达式例如:(int)('b'+3*x)%31/(float)a+6注意:(float)22/5与(float)(22/5)不同错误的类型转换:(int)b=a+5b=int(3*a)61