- 10.45 MB
- 2022-04-22 11:37:35 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'课后答案网您最真诚的朋友www.hackshp.cn网团队竭诚为学生服务,免费提供各门课后答案,不用积分,甚至不用注册,旨在为广大学生提供自主学习的平台!课后答案网:www.hackshp.cn视频教程网:www.efanjy.comPPT课件网:www.ppthouse.com
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!第1章基本C++语言C++是在20世纪80年代初期由贝尔实验室设计的一种在C语言的基础上增加了对面向对象程序设计支持的语言,它是目前应用最为广泛的编程语言。本章先来说明C++程序结构,然后详细讨论数据类型、运算符与表达式、基本语句、函数和预处理、构造类型、指针和引用等内容。需要说明的是,在学习本章之前最好先课后答案网做实验1。1.1C++程序结构同其他程序设计语言一样,www.hackshp.cnC++也有自己的程序结构。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.1.1几个C++程序下面先来介绍几个比较简单的C++程序。[例Ex_Simple1]一个简单的C++程序#include"stdafx.h"/*C++程序的基本结构*/#includevoidmain()课后答案网{doubler,area;//声明变量cout<<"输入圆的半径:www.hackshp.cn";//显示提示信息cin>>r;//从键盘上输入变量r的值area=3.14159*r*r;//计算面积cout<<"圆的面积为:"<voidDoDraw(intnum);//声明一个全局函数voidmain(){intnum=5;//课后答案网定义并初始化变量DoDraw(num);//函数的调用}voidDoDraw(intnum)www.hackshp.cn//函数的定义{for(inti=0;iclassCDrawArray//定义一个类{public:voidDoDraw(intnum);//声明类的公有成员函数};课后答案网voidCDrawArray::DoDraw(intnum)//成员函数的实现{for(inti=0;i#definePI3.14159课后答案网voidmain(){doubler=100.0,area;www.hackshp.cnarea=PI*r*r;cout<<"圆的面积是:"<constdoublePI=3.14159;voidmain(){doubler=100.0,area;课后答案网area=PI*r*r;cout<<"圆的面积是:"<”,表示括号中的内容是必需指定,若为方括号“[]”,则括号中的内容是可选的,本书作此约定):课后答案网<数据类型><变量名表>;变量名和数据类型是告诉编译器要为其分配多少内存空间,以及变量中要存取的是什么类型的数据。例如:intnNum1;www.hackshp.cnintnNum2;intnNum3;doublex;这样,nNum1、nNum2、nNum3分别占用4个字节的存储空间,其存取的数据类型是int型,称之为“整型变量”,而x则占用8个字节的存储空间,存取的数据类型是double型,称之为“双精度实型变量”。有时,为使代码简洁,还可以将同类型的变量定义在一行语句中,不过同类型的变量名要用逗号(,)分隔。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.2.3变量2.变量的初始化程序中常需要对一些变量预先设置初值,即将初值存储在变量名所代表的内存空间,这一过程称为初始化。在C++中,变量初始化是在定义变量时同时赋初值。例如:课后答案网intnNum1=3;//指定nNum1为整型变量,初值为3doublex=1.28;//指定x为双精度实变量,初值为1.28charwww.hackshp.cnc=‘G’;//指定c为字符变量,初值为‘G’也可以在多个变量的定义语句中单独对某个变量初始化,如:intnNum1,nNum2=3,nNum3;变量的初始化还有另外一种形式,例如:intnX(1),nY(3);表示nX和nY是整型变量,它们的初值分别为1和3。。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.2.4基本输入、输出1.输出流(cout)通过cout可以输出一个整数、实数、字符及字符串,cout中的插入符“<<”可以连续写多个,每个后面可以跟一个要输出的常量、变量、转义序列符、对象以及表达式等。[例Ex_CoutEndl]cout课后答案网的输出算子endl#includevoidmain(){www.hackshp.cncout<<"ABCDt"<<1234<<"t"<voidmain(){intnNum=1234;doublefNum课后答案网=12.3456789;cout<<"1234567890"<><表达式1>[>><表达式2>...]其中,提取符“>>”可以连续写多个,每个后面跟一个表达式,该表达式通常是获得输入值的变量或对象。例如:课后答案网intnNum1,nNum2,nNum3;cin>>nNum1>>nNum2>>nNum3;要求用户从键盘上输入三个整数。输入时,必须在3个数值之间加上一些空格来分隔,空格的个数不限,最后用回车键结束输入www.hackshp.cn(书中出现的“”表示输入一个回车键,特此约定);或者在每个数值之后按回车键。例如,上述输入语句执行时,用户可以输入:12920或12920
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.2.4基本输入、输出3.格式算子格式算子oct、dec和hex能分别将输入或输出的数值转换成oct、dec和hex八进制、十进制及十六进制,例如:[例Ex_Algorism]格式算子的使用#includevoidmain(){课后答案网intnNum;cout<<"PleaseinputaHexinteger:";cin>>hex>>nNum;cout<<"Octt"<voidmain(){www.hackshp.cnshortnTotal,nNum1,nNum2;nNum1=nNum2=1000;nTotal=nNum1*nNum2;cout<>=它们都是在赋值符“=”之前加上其它运算符而构成的,其中的算术复合赋值运算符的含义如表1.3所示。课后答案网表1.3复合赋值运算符www.hackshp.cn
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.2赋值运算符1.复合赋值复合运算符的优先级和赋值符的优先级一样,在C++的所有运算符中只高于逗号运算符,而且复合赋值运算符的结合性也是从右至课后答案网左的,所以在组成复杂的表达式时要特别小心。例如:www.hackshp.cna*=b-4/c+d;等效于a=a*(b-4/c+d);而不等效于a=a*b-4/c+d;
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.2赋值运算符2.多重赋值所谓多重赋值是指在一个赋值表达式中出现两个或更多的赋值符(“=”),例如:nNum1=nNum2=nNum3=100;由于赋值符的结合性是从右至左的,因此上述的赋值是这样的过程:首先对赋值表达式nNum3=100求值,即将100赋值给nNum3,同时该赋值表达式取得值100;然后将该值赋给课后答案网nNum2,这是第二个赋值表达式,该赋值表达式也取得值100;最后将100赋给nNum1。由于赋值是一个表达式,所以它几乎可以出现在程序的任何地方,例如:a=7+(b=8)www.hackshp.cn(赋值表达式值为15,a值为15,b值为8)a=(c=7)+(b=8)(赋值表达式值为15,a值为15,c值为7,b值为8)
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.3数据类型转换在进行运算时,往往要遇到混合数据类型的运算问题。例如一个整型数和一个实数相加就是一个混合数据类型的运算。C++采用两种方法对数据类型进行转换,一种是“自动转换”,另一种是“强制转换”。课后答案网www.hackshp.cn
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.3数据类型转换自动转换自动转换是将数据类型从低到高的顺序进行转换,如图1.2所示。课后答案网www.hackshp.cn图1.2类型转换的顺序例如:10+‘a’+2*1.25-5.0/4L的运算次序如下:(1)进行2*1.25的运算,将2和1.25都转换成double型,结果为double型的2.5。(2)进行5.0/4L的运算,将长整型4L和5.0都转换成double型,结果值为1.25。(3)进行10+‘a’的运算,先将‘a’转换成整数97,运算结果为107。(4)整数107和2.5相加,先将整数107转换成double型,结果为double型,值为109.5。(5)进行109.5-1.25的运算,结果为double型的108.25。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.3数据类型转换2.强制转换强制转换是在程序中通过指定数据类型来改变图1.2所示的类型转换顺序,将一个变量从其定义的类型改变为另一种新的类型。强制类型有下列两种格式:(<类型名>)<表达式><类型名>(<表达式>)这里的“类型名”是任何合法的课后答案网C++数据类型,例如float、int等。通过类型的强制转换可以将“表达式”转换成适当的类型,例如:doublef=3.56;intnNum;www.hackshp.cnnNum=(int)f;或者nNum=int(f);都是将使nNum的值变为3。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.4关系运算符关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上是比较两个操作数是否符合给定的条件。若符合条件,则关系表达式的值为“真”,否则为“假”。在C++编译系统中,往往将“真”表示为“true”或1,将“假”表示为“false”或0。而任课后答案网何不为0的数被认为是“真”,0被认为是“假”。由于关系运算需要两个操作数,所以关系运算符都是双目运算符。C++提供了下列www.hackshp.cn6种关系运算符:<(小于),<=(小于等于),>(大于),>=(大于等于),==(相等于),!=(不等于)其中,前4种的优先级相同且高于后面的两种。例如:a==b>c等效于a==(b>c)但关系运算符的优先级低于算术运算符(其他可参见表1.4)。例如:a=b3&&2||8<4-!0表达式的运算过程是这样的:(1)进行“!0”的运算,结果为1(“真”)。(2)进行“4-1”运算,结果为3,这样表达式变成“5>3&&2||8<3”。(3)处理“5>3”,结果为“真”,这里用1表示。(4)处理“8<3”,结果为“假”,这里用0表示。这样表达式变成“1&&2||0”(5)进行“1&&2”的运算,结果为1(“真”),因为2是不等于0的数。(6)最后结果为1(“真”)。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.6位运算符位运算符是对操作数按其在计算机内表示的二制数逐位地进行逻辑运算或移位运算,参与运算的操作数只能是整型常量或变量。C++语言提供了六种位运算符:~(按位求反,单目运算符)<<(左移,双目运算符)>>(右移,双目运算符课后答案网)&(按位与,双目运算符)^(按位异或,双目运算符)|(按位或,双目运算符)“按位求反”是将一个二进制数的每一位求反,即www.hackshp.cn0变成1,1变成0。“按位与”是将两个操作数对应的每个二进制位分别进行逻辑与操作。“按位或”是将两个操作数对应的每个二进制位分别进行逻辑或操作。“按位异或”是将两个操作数对应的每个二进制位分别进行异或操作。“左移”是将左操作数的二进制值向左移动指定的位数,它具有下列格式:操作数<<移位的位数
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.7三目运算符C++中惟一的三目运算符是条件运算符,其格式如下:<条件表达式>?<表达式1>:<表达式2>“条件表达式”是C++中可以产生“真”和“假”结果的任何表达式,如果条件课后答案网表达式的结果为“真”,则执行表达式1,否则执行表达式2。例如:nNum=(a>b)?10:8;注意,只有在表达式www.hackshp.cn2后面才能出现分号结束符,“表达式1”和“表达式2”中都不能有分号。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.8自增和自减运算符单目运算符自增(++)和自减(--)为整型变量加1或减1提供一种非常有效的方法。++和--既可放在变量的左边也可以出现在变量的右边,分别称为前缀运算符和后缀运算符。例如:i++;或++i;(等效于i=i+1;或i+=1;)i--;或--i;(等效于i=i-1;或i-=1;)这是要特别注意:课后答案网若前缀运算符和后缀运算符仅用于某个变量的增1和减1,则这两都是等价的,但如果将这两个运算符和其他的运算符组合在一起,在求值次序上就会产生根本的不同:www.hackshp.cn如果用前缀运算符对一个变量增1(减1),在将该变量增1(减1)后,用新的值在表达式中进行其他的运算。如果用后缀运算符对一个变量增1(减1),用该变量的原值在表达式进行其他的运算后,再将该变量增1(减1)。例如:a=5;b=++a-1;//相当于a=a+1;b=a–1;和a=5;b=a++-1;//相当于b=a–1;a=a+1;
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.8自增和自减运算符虽然它们中的a值的结果都是6,但b的结果却不一样,前者为5,后者为4。在自增和自减混合运算时,一要注意次序,二要注意变量是表示相应的存储空间这个特性。例如:b=a++*--a*a++;//相当于a=a–1;b=a*a*a;a=a+1;a=a+1;//若a初值为5,该句执行后,则b=64,a=6;这比较好理解,若a的初值为课后答案网5,当有:b=--a*--a*--a;则不同的编译器有不同的处理方式,TurboC++或BorlandC++认为其相当于:a=a–1;a=a–1;a=a–1;b=a*a*a;www.hackshp.cn显然执行该语句后的结果为a=2,b=8。而VisualC++先计算--a*--a,即其相当于:a=a–1;a=a–1;b=a*a;此时a=3,b=9;然后计算9*--a,即其相当于:a=a–1;b=9*a;结果a=2,b=18。无论是何种处理方式,可千万不要认为是b=4*3*2,那是完全错误的,因为变量a是表示一个相应的存储空间,在同一运行周期中,其存储的数值不应有两种可能。再比如,若a的初值为5,当有:b=a++*--a*--a;//执行该语句后,TC++或BC++:a=4,b=27。VC++:a=4,b=48。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.9逗号运算符逗号运算符是优先级最低的运算符,它可以使多个表达式放在一行上,从而大大简化了程序。在计算时,C++将从左至右逐个计算每个表达式,最终整个表达式的结果是最后计算的那个表达式的类型和值。例如:j=(i=12,i+8);式中,i=12,i+8是含逗号运算符的表达式,计算次序是先计算表达式课后答案网i=12,然后再计算i+8,整个表达式的值是最后一个表达式的值,即i+8的值20,从而j的结果是20。再如:www.hackshp.cnd=(a=1,b=a+2;c=b+3);d的结果为6。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.10sizeof运算符sizeof的目的是返回操作数所占的内存空间大小(字节数),它具有下列两种格式:sizeof(<表达式>)sizeof(<数据类型>)例如:sizeof(“Hello”)//计算字符串常量“课后答案网Hello”所占内存的字节大小,结果为6sizeof(int)//计算整型int所占内存的字节数需要说明的是,由于同一类型的操作数在不同的计算机中占用的存储字节数可能不同,因此sizeofwww.hackshp.cn的结果有可能不一样。例如sizeof(int)的值可能是4,也可能是2。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.3.11优先级、结合性和运算次序课后答案网www.hackshp.cn
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.4.1表达式语句、空语句和复合语句[例Ex_Block]块语句的变量使用范围。#includevoidmain(){inti=5,j=6;课后答案网cout<)<语句1>[else<语句2>]这里的if、else是C++的关键字。注意,课后答案网if后的一对圆括号不能省。当“表达式”为“真”(true)或不为0时,将执行语句1。当“表达式”为“假”(false或0)时,语句2被执www.hackshp.cn行。其中,else可省略,即变成这样的简单的if语句:if(<表达式>)<语句>当“表达式”为“真”(true)或不为0时,语句被执行。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.4.2选择结构语句[例Ex_Compare]输入两个整数,比较两者的大小#includevoidmain(){intnNum1,nNum2;cout<<"Pleaseinputtwointegernumbers:";课后答案网cin>>nNum1>>nNum2;if(nNum1!=nNum2)if(nNum1>nNum2)www.hackshp.cncout<"<nNum2。当然,表达式的类型也可以是任意的数值类型(包括整型、实型、字符型等)。例如:if(3)cout>>"Thisisanumber3";执行结果是输出"Thisisanumber3";因为3是一个不为0的数,条件总为“真”。(2)适当添加花括号(“{}”)来增加程序的可读性。例如:上面例Ex_Compare中的条件语句还可写成下列形式,其结果是一样的。课后答案网if(nNum1!=nNum2){if(nNum1>nNum2)cout<"<nNum2)cout<"<){case<常量表达式课后答案网1>:[语句1]case<常量表达式2>:[语句2]...case<常量表达式n>:[语句n][defaultwww.hackshp.cn:语句n+1]}其中switch、case、default都是关键字,当表达式的值与case中某个表达式的值相等时,就执行该case中“:”号后面的所有语句。若case中所有表达式的值都不等于表达式的值,则执行default:后面的语句,若default省略,则跳出switch结构。需要注意的是:switch后面的表达式可以是整型、字符型或枚举型的表达式,而case后面的常量表达式的类型必须与其匹配。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.4.2选择结构语句[例Ex_Switch]根据成绩的等级输出相应的分数段#includevoidmain(){charchGrade;cout<<"Pleaseinputachar(A~E):";cin>>chGrade;switch(chGrade)课后答案网{case"A":case"a":cout<<"90--100"<)<语句>while是关键字,<语句>是此循环的循环体,它可以是一条语句,也可以是多条语句。当为多条语句时,一定要用花括号课后答案网(“{}”)括起来,使之成为复合语句,如果不加花括号,则while的范围只到while后面第一条语句。当表达式为非0(“真”)时便开始执行while循环体中的语句,然后反复执行,每次执行都会判断表达式是否为非0,若等于www.hackshp.cn0(“假”),则终止循环。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.4.3循环结构语句[例Ex_SumWhile]求整数1到50的和#includevoidmain(){intnNum=1,nTotal=0;while(nNum<=50)课后答案网{nTotal+=nNum;nNum++;www.hackshp.cn}cout<<"Thesum,from1to50,is:"<while(<表达式>)其中do和while都是C++关键字,<语句>是此循环的循环体,它可以是一条语句,也可以是复合语句。当语句执行到while时,将判断表达式是否为非0值,若是,则继续执行循环体,直到下一次表达式等于0课后答案网为止。例如Ex_SumWhile用do...while循环语句可改写成:[例Ex_SumDoWhile]求整数1到50的和#includevoidmain()www.hackshp.cn{intnNum=1,nTotal=0;do{nTotal+=nNum;nNum++;}while(nNum<=50);cout<<"Thesum,from1to50,is:"<其中for是关键字,<语句>是此循环的循环体,它可以是一条语句,也可以是复合语句。一般情况下,[表达式1]用作循环变量的初始化,课后答案网[表达式2]是循环体的判断条件,当等于非0(true)时,开始执行循环体,然后计算[表达式3],再判断表达式2的值是否为非0,若是,再执行循环体,再计算表达式3,如此反复,直到表达式2等于0(false)为止。其流程如图1.3所示。www.hackshp.cn图1.3for循环流程图
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.4.3循环结构语句例如,Ex_SumWhile用for循环语句可改写成:[例Ex_SumFor]求整数1到50的和#includevoidmain(){intnTotal=0;课后答案网for(intnNum=1;nNum<=50;nNum++)nTotal+=nNum;cout<<"Thesum,from1to50,is:"<voidmain(){www.hackshp.cnfor(intnNum=1;nNum<=100;nNum++){if(nNum%7==0)continue;cout<<函数名>(<形式参数表>){<若干语句>课后答案网函数体}可以看出,一个函数的定义是由函数名、函数类型、形式参数表和函数体四个部分组成的。函数类型决定了函数所需要的返回值类型,它可以是函数或数组之外www.hackshp.cn的任何有效的C++数据类型,包括构造的数据类型、指针等。如果不需要函数有返回值,只要定义函数的类型为void即可。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.1函数的定义和调用2.函数的声明声明一个函数可按下列格式进行:<函数类型><函数名>(<形式参数表>);其中,形参的变量名可以省略。但要注意,函数声课后答案网明的内容应和函数的定义应相同。例如对于www.hackshp.cnsum()函数的声明如下:intsum(intx,inty);和intsum(int,int);是等价的。但末尾的分号“;”不要忘记。需要说明的是,函数的声明又可称为对函数的原型进行说明。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.1函数的定义和调用3.函数的调用函数调用的一般形式为:<函数名>(<实际参数表>);所谓“实际参数”(简称“实参”),它与“形参”相对应,是实际调用函数时所给定的常量、变量或表达式,且必须有确定的值。例如:inta[5]={7,9,6,3,4};课后答案网sum(a[0],6);或sum(a[0]*a[1],a[2]+a[3]);www.hackshp.cn等都是合法的调用。需要注意的是:实参与形参的个数应相等,类型应一致,且按顺序对应,一一传递数据。C++中,调用一个函数的方式可以有很多,例如:sum(3,4);//Aintc=2*sum(4,5);//Bc=sum(c,sum(c,4));//C)其中,A是将函数作为一个语句,不使用返回值,只要求函数完成一定的操作;B把函数作为表达式的一部分,将返回值参与运算,结果c=18;C是将函数作为函数的实参,等价于“c=sum(18,sum(18,4));”,执行sum(18,4)后,等价于“c=sum(18,22);”,最后结果为c=40。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.2函数的参数传递[例Ex_SwapValue]交换函数两个参数的值。#includevoidswap(floatx,floaty){floattemp;temp=x;x=y;y=temp;课后答案网cout<<"x="<>a;if(a<0)www.hackshp.cn{a=-a;intb;//b的作用域起始处…}//b的作用域终止处}//a的作用域终止处代码中,声明的局部变量a和b处在不同的块中。其中变量a是在fun函数的函数体块中,因此在函数体这个范围内,该变量是可见的。而b是在if语句块中声明的,故它的作用域是从声明处开始到if语句结束处终止。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.3作用域和存储类型1.作用域(2)函数原型作用域。例如:doublemax(doublex,doubley);课后答案网和doublemax(double,double);www.hackshp.cn是等价的。不过,从程序的可读性考虑,在声明函数原型时,为每一个形参指定有意义的标识符,并且和函数定义时的参数名相同,是一个非常好的习惯。(3)函数作用域。(4)文件作用域。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.3作用域和存储类型2.变量的存储类型这些存储类型的声明是按下列格式进行的:<存储类型><数据类型><变量名表>;(1)自动类型(auto)。一般说来,用自动存储类型声明的变量都是限制在某个程序范围内使用的,即为局部变量。从系统角度来说,自动存储类型变量是采用动态分配方式来分配内存空间的。因此,当程序执行到超出该变量的作用域时,就释放它所占用的内存空间,其值也随之消失了。课后答案网在C++语言中,声明一个自动存储类型的变量是在变量类型前面加上关键字auto,例如:autointi;若自动存储类型的变量是在函数内或语句块中www.hackshp.cn声明的,则可省略关键字auto,例如:inti;(2)静态类型(static)。静态类型变量也是一种局部变量。它和自动存储类型的变量的最大不同之处在于:静态类型变量在内存中是以固定地址存放的,它采用静态分配方式来分配内存空间的。在这种方式下,只要程序还在继续执行,静态类型变量的值就一直有效,不会随它所在的函数或语句块的结束而消失。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.3作用域和存储类型在C++语言中,声明一个静态类型的变量是在变量类型前面加上关键字static。例如:[例Ex_Static]使用静态类型的局部变量#includevoidcount(){inti=0;staticintj=0;//静态类型课后答案网cout<<”i=”<课后答案网voiddisplay(inta,intb=2,intc=3)//在函数的定义中设置默认参数{cout<<"a="<0时
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.5函数的递归调用#includelongfactorial(intn);voidmain(){课后答案网cout<inlinefloatfmax(floatx,floaty){returnx>y?x:y;}voidmain(){课后答案网floata,b;cout<<"请输入两个实数:";cin>>a>>b;www.hackshp.cncout<<"最大的数为:"<intsum(intx,inty);intsum(intx,inty,intz);doublesum(doublex,doubley);课后答案网doublesum(doublex,doubley,doublez);voidmain(){cout<(参数名表)字符串在字符串中包括了括号内的参数,称为形参,以后在程序中这些形参将被实参替换。例如例如:#defineMAX(a,b)((a)>(b)?(a):(b))课后答案网其中(a,b)是宏MAX的参数表,如果在程序出现下列语句:x=MAX(3,9);则预处理后变成:www.hackshp.cnx=((3)>(9)?(3):(9));//结果为9很显然,带参数的宏相当于一个函数的功能,但却比函数简捷。需要注意的是:定义有参宏时,宏名与左圆括号之间不能留有空格。否则,编译器将空格以后的所有字符均作为替代字符串,而将该宏视为无参数的宏定义。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.8预处理3.文件包含命令所谓“文件包含”是指将另一个源文件的内容合并到源程序中。C++语言提供了#include命令用来实现文件包含的操作,它有下列两种格式:课后答案网#include<文件名>#include“www.hackshp.cn文件名”在使用#include命令需要注意的是,一条#include命令只能包含一个文件,若想包含多个文件须用多条文件包含命令。例如:#include#include...
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.8预处理4.条件编译命令一般情况下,源程序中所有的语句都参加编译,但有时也希望根据一定的条件去编译源文件的不同部分,这就是“条件编译”。条件编译使得同一源程序在不同的编译条件下得到不同的目标代码。C++提供的条件编译命令有几种常用的形式,现分别介绍如下:课后答案网第一种形式#ifdef<标识符><程序段www.hackshp.cn1>[#else<程序段2>]#endif其中,#ifdef、#else和#endif都是关键字,<程序段>是由若干条预处理命令或语句组成的。这种形式的含义是:如果标识符已被#define命令定义过,则编译<程序段1>,否则编译<程序段2>。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.8预处理[例Ex_UseIfdef]使用#ifdef条件编译命令#include#defineLIvoidmain(){#ifdefLIcout<<"Hello,LI!n";课后答案网#elsecout<<"Hello,everyone!n";#endif}www.hackshp.cn运行结果:(2)第二种形式#ifndef<标识符><程序段1>[#else<程序段2>]#endif这与前一种形式的区别仅在于,如果标识符没有被#define命令定义过,则编译<程序段1>,否则就编译<程序段2>。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.5.8预处理[例Ex_UseIfdef]使用#ifdef条件编译命令(3)第三种形式#if<表达式1><程序段1>[#elif<表达式2><程序段2>课后答案网...][#else<程序段www.hackshp.cnn>]#endif其中,#if、#elif、#else和#endif是关键字。它的含义是,如果<表达式1>为“真”就编译<程序段1>,否则如果<表达式2>为“真”就编译<程序段2>,...,如果各表达式都不为“真”就编译<程序段n>。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.6构造类型1.6.1数组数组是相同类型的元素的有序集合,每个元素在数组中的位置可用统一的数组名和下标来惟一确定。1.数组的定义定义一个数组可按下列格式进行:<数据类型><数组名>[<常量表达式1>][<常量表达式2>]...<数组名>后面的[<常量表达式课后答案网1>][<常量表达式2>]...用于确定数组的维数和大小。如:inta[10];它表示数组名为a,一维数组,此数组有10个元素,每个元素的类型都是整型。又如:floatb[2][3];charwww.hackshp.cnc[4][5][6];其中,b是实型的二维数组,它有2x3个元素,每个元素的类型都是实型。c是字符型的三维数组,它有4x5x6个元素,每个元素的类型都是字符型。一般地,表示某维大小的常量表达式中不能包含变量,但可以包括常量和符号常量,其值必须是一个确定的整型数值,且数值大于1。例如:inta[4-2][3*6];constintSIZE=18;intb[SIZE];都是合法的数组定义。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.6.1数组2.数组元素的引用数组定义后,就可以引用数组中的元素,引用时按下列格式:<数组名>[<下标>]...例如a[0]、b[5]等,这里的0和5是数组的下标,a和b是定义过的数组名。需要注意的是:(1)C++数组的下标总是从0开始的,也就是说,a[0]是数组a的第一个元素;但下标一定要小于数组定义时的大小。也就是说,长度为课后答案网n的数组,其下标范围为0~(n-1)。例如,inta[5];它的数组元素下标应从0到4,而没有a[5]这个数组元素。(2)下标可以是整型常量或整型表达式,且引用的元素下标个数应与数组定义的维数一致。例如:www.hackshp.cnintd[2][3][4];是三维数组,d[0][2][3],d[0][1][2]都是合法的元素,但d[1][2]或d[1][3][]等都是不合法的数组元素的引用。(3)数组定义后,系统会根据数组的大小开辟相应的内存,并依照下标的高低依次存放数组中的各个元素。例如一维数组a[5]的存放次序是:a[0],a[1],a[2],a[3],a[4]。(4)由于每一个数组元素都可以看成是一个与数组类型相同的变量,因此在程序中对某个或所有数组元素进行赋值或其他处理时,它的操作与变量类似。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.6.1数组3.一维数组的初始化和赋值数组中的元素既可以在数组定义的同时赋初值,即初始化,也可以在定义后赋值。例如:inta[5]={1,2,3,4,5};是将整数1,2,3,4,5分别赋于数组a的各个元素,注意要将这些初值用花括号“{}”括课后答案网起来。它与下列的赋值语句的结果是相同的:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;当然,也可以给其中的一部分元素赋值。例如:www.hackshp.cnintb[5]={1,2};是将数组b的元素b[0],b[1]分别赋予1,2的值。需要说明的是,在对数组进行初始化中,若没有明确列举元素值的元素,则其值均为0。有时,在对全部数组元素赋初值时,可以不指定数组的长度;例如intc[]={1,2,3,4,5};系统将据数值的个数自动定义c数组的长度,这里是5。
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.6.1数组4.二维数组的初始化和赋值二维数组可以看成一个具有行和列的数据表,例如intb[3][4];它在内存空间的存放次序是:b[0][0],b[0][1],b[0][2],b[0][3],//第0行b[1][0],b[1][1],b[1][2],b[1][3],//第1行b[2][0],b[2][1],课后答案网b[2][2],b[2][3]。//第2行可见,在数组b[3][4]中,3表示行数,4表示列数。因此,在进行二维数组进行初始化时可以采用以“行”为单位来进行。例如:intd[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};其中,最外面的一对花括号里面的www.hackshp.cn{1,2,3,4}是对第0行元素进行初始化,{5,6,7,8}是对第1行元素进行初始化,{9,10,11,12}是对第2行元素进行初始化。每对花括号里的数据个数均不能大于列数。它等价于intd[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};//依次对元素进行初始化
课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!1.6.1数组5.排序数组作为一种常见的数据结构,在许多方面都得到了应用。“排序”就是一个常用的应用实例。例如:[例Ex_ArraySort]把5个整型数按从小到大的次序排列#include#defineN5voidmain(){inta[N]={20,40,-50,7,13};课后答案网intmin,k;for(inti=0;ia[j]){min=a[j];k=j;}}a[k]=a[i];a[i]=min;}for(i=0;i#defineN5voidmain(){inta[N]={20,40,-50,7,13};for(inti=1;ia[j+1]){inttemp;temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}for(i=0;i