目录
1 - 常量与变量
1.1 常量
在程序中,值始终不变的数据称为常量,如字符常量‘a',整型常量10,实型常量3.14等。
另外,还有一种用标识符表示的数值不变的常量,称为符号常量。一般符号常量均为大写,如
const float PI=3.14
1.2 变量
变量是一个有名字,有特点属性的存储单元。在程序运行期间,变量的值是可以改变的。变量必须先定义,后使用。
变量可以在定义时初始化,如
int a=1,b=1;
也可以连续赋值,如
int a,b;
a=b=c;
但不可以边定义边赋值,如
int a=b=1;//不正确
1.3 变量的分类
变量根据作用域的不同,可分为局部变量和全局变量。
变量根据存储类别可分为四大类,分别是自动变量、静态局部变量、外部变量、寄存器变量。这四种变量的基本区别如下表所示。
序号 | 存储类型 | 标识符 | 变量主要特点 | 说明 |
---|---|---|---|---|
1 | 自动变量 | auto | 动态分配存储空间 | auto经常省略 |
2 | 静态局部变量 | static | 局部变量在函数调用结束后不会消失,仍保留着原值 | |
3 | 外部变量 | extern | 把外部变量的作用域扩展到定义位置 | |
4 | 寄存器变量 | register | 执行效率远高于内存变量,用于频繁调用的变量 |
2 - C++的三种基本控制结构
C++的三种基本控制结构是如图1所示。
图1- C++的三种基本控制结构
2.1 顺序结构
顺序结构按照程序的先后顺序自上而下地执行。图1中,第一幅是顺序执行的,执行完A框所指的操作后,接着执行B狂所制定的操作。
所有的程序从整体而言都是一种顺序结构。
2.2 选择结构
选择结构又称分支结构,此结构包含一个判断框,根据给定的条件p是否成立二选择执行A框或B框。
选择结构又分为单分枝、双分枝和多分枝三种
(1)单分枝结构
单分枝结构的表达式为
if(表达式)
{
语句1;
}
单分枝结构的含义:若表达式为真(即值不为0),则执行语句1,否则不执行。若包含多条语句,则加一对“{}”。
(2)双分枝结构
双分枝结构的表达式为
if(表达式)
{
语句1;
}
else
{
语句2;
}
双分枝结构的含义是:若表达式为真,则执行 语句1,否则执行语句2。
(3)多分枝结构
多分枝结构往往都是嵌套使用大的,在if语句中又包含一个或多个if语句,称为if语句的嵌套。
if语句的嵌套表达式为
if(表达式1)
{
语句1;
}
else
{
if(表达式2)
{
语句2;
}
else
{
语句3;
}
}
else总是与它前面最近且为配对过的if匹配。
复合语句内的if关键字堆外界而言是不可见的。
例如:
if(表达式1)//第1个if
{
if(表达式2)//第2个if
{
if(表达式3)//第3个if
{
语句3;
}
}
else
{
语句2;//与第2个if相匹配
}
}
(4)使用switch进行多分枝选择结构
switch(表达式){
case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
…
case 常量表达式n:语句n;break;
default:语句;
}
注意:
- 表达式的值必须是整形、字符型或枚举型。
- 多个case标号可以共用一组语句序列,以实现对多个常量执行同一个操作。
- default可以省略
- break表示终止switch,转而执行switch下面的语句;若不佳break,则执行完case后面的分枝后会顺序执行下一个case分枝。
2.3 循环结构
(1)用for语句实现循环。
for(初始表达式1;循环条件表达式2;循环变化表达式3)
{
循环语句;
}
注意:
- 3个表达式都可以省略,但是分号不能省略。
- 执行时,表达式1只在开始时执行一次,然后判断表达式2是否为真;若为真,则执行循环语句,否则不执行。
(2)用while语句实现循环
while语句——当型循环的表达式
while(初始表达式)
{
循环语句;
}
- 当表达式为真(表达式为非0)时,执行循环语句。
- 先判断,后循环。
- 当有多条语句要执行时,要用花括号把多个语句括起来。
- 在循环语句中必须有循环改变的语句,否则会出现死循环。
do…while语句——直到型循环的表达式为
do{
循环语句;
}while(条件表达式);
- do…while循环后面的分号一定不能丢;
- do…while循环先执行、后判断,至少执行一次
while循环可以理解为先量一下这棵树长度够不够,如果够,我就砍;否则我就走。而do…while循环可以理解为我先把这棵树砍了,在量一量长度,如果够,我就带走;否则我就走 。
(3)跳转语句
使用跳转语句可以实现程序执行流程的无条件跳转。
C++提供了3种跳转语句,分别如下。
- break语句
在循环题内的break语句可以使循环立即结束,退出循环继续向下执行。但是break语句只能退出本层循环,如
for(…)
{
while(…)
{
…;
}
for(…)
{
break;
}
}
若满足上面的if条件,则推出内层的while循环,而不会退出for循环,开始下一次的for循环。
- continue语句
continue语句的作用时终止本次循环,开始执行下一次循环。
- return语句
return表示把整个程序流程从被调用函数转向主调函数,并把表达式的值带回给主调函数,实现函数值的返回,返回时可附带一个返回值,有return后面的参数指定;也可用循环题中满足条件时的结束语句。
3 - 数组
3.1 数组的定义与赋值
数组是一组有序数列的集合,数组的定义主要分三部分构成:数据类型、数组名和数组的大小。以下是一个int类型数组的定义
int arr[5];
该数组定义了 一个名为a,大小为5的整型数组,相当于定义了5个整型变量,每个变量采用数组名和下标的组合进行标记,而且这5个整型变量值都存储在连续的内存位置,其内存示意图如图2所示。
图2 - 5个元素的示意图
数组的输入一般采用循环:
for(int i=0; i<n; i++)
{
cin>>a[i];
}
3.2 数组的访问
在数组中,每个数组元素作为单独的变量进行访问和使用,并且第一个元素的下标是0,最后一个元素的下标是n-1。
例如:定义a数组中的5个元素,则下标为0~4,如果企图访问a[5],则会出现下标溢出。
数组的变量名表示数组的内存首地址,即a相当于&a[0]。
3.3 二维数组的定义
定义一个二维数组的方法为
int a[2][3]={{1,2,3},{4,5,6}};
该二维数组的形式如图3所示
图3 - 二维数组的内存示意图
而为数组的输入一般采用双重循环的形式,如:
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
{
cin>>a[i][j];
}
}
4 - 函数
4.1 函数的定义
一个函数不可或缺的部分为
返回值数据类型 函数名(形式参数)
{
函数体;
return 返回值;
}
- 函数体是一个复合语句,必须加大括号{};
- 函数名的命名规则同变量的命名规则;
- 如果函数具有返回值,则必须说明返回值类型,否则无返回值的函数应当使用void定义,说明函数无返回值;具有返回值的函数,函数体内一定要由return返回一个值。
- 函数的参数称为形式参数,可以有多个,用逗号分隔;也可以一个都没有,称为无参数函数。形式参数是函数的局部变量。
4.2 函数参数的传递
程序中,实参向形参是单向传递的方式,并且普通变量作为函数参数,实参将值传递给形参。数组元素作为函数参数,也同样属于单项值的传递。
指针(包括数组名)作为函数参数,由于指针变量和数组名的值均为地址,因此实参和形参之间的传递是地址,其结果是形参指向了实参所指的地址,如
void swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
int a=5,b=10;
swap(a,b);
其结果是交换了变量a和变量b的值。
下面拿的函数用普通变量作为参数,是无法实现交换功能的。
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
int a=5,b=10;
swap(a,b);
a和b的值没有发生变化,函数仅仅是交换了其局部变量x和y的值。
指针和数组名作为参数的形式:
- 形参是指针,实参是数组名或某个元素的地址;
- 形参是数组名,实参是指向数组的指针;
- 形参是指针,实参也是。
4.3 递归函数
函数体内调用自身称为递归。递归的过程分为递推和回溯两个过程,可以解决的问题有求阶乘、n皇后、斐波那契数列等。
所有程序从main函数开始顺序执行,函数调用可以看作是一个无条件跳转,跳转到对应函数的指令处开始执行,当碰到return函数或者函数结尾是,在执行一遍无条件跳转,跳转回调用方,执行调用函数后的下一条指令。函数调用的一般过程如图3所示。
图3 函数调用的一般过程
递归函数就是一个函数体内直接或者间接调用它自己,没调用一次就进入新的一层。递归函数必须有结束递归的条件。函数在一只递推,直到遇到结束条件才返回。
好啦 ,以上就是本节的内容啦,希望大家有所收获!