控制程序流程
1>使用if else
2>嵌套if语句
if(){if(){}} 与java相同
3>switch case :能够将特定表达式与一系列常量进行比较,并根据表达式的值时执行不同的操作。经常会使用C++新增的关键字switch case default break
switch(a){
case 2:
break;
case 3:
xxx
break;
default:
xx
break;
}
4>使用? : 进行条件处理(三目运算符)
int max = (num1 > num2) ? num1 : num2;
注意:不要包含两个标签相同的case语句,这即不符合逻辑,也无法通过编译
使用三目运算符? : 时,不要使用复杂的条件和表达式
5>在循环中执行代码
不成熟的goto循环:goto指示跳到代码的特定位置继续执行,您可使用它回过头去再次执行特定的语句
void gotoUtil(){
int i = 0;
Start:
i++;
std::cout << “i :” << i << std::endl;
if(i == 1){
goto Start;
}
}
6>while循环
while(expression){
xxx
}
只要expression为true,就将反复执行该语句
void whileUtil(){
int i = 0;
while(i < 10){
i++;
std::cout << "哈哈哈,i的值是:" << i << std::endl;
}
}
7>do…while循环
先执行一次do中的语句,确保他们至少执行一次
do{
}while(i < 102);
8>for 循环 与java相同
9>基于范围的for循环
for (VarType varName : sequence){
//xxx
int numbers[5] = {1,9,8,6,3};
int a = 0;
for(int i : numbers){
std::cout << "数组中的第" << a << "是:" << i << std::endl;
a++;
}
输出:
数组中的第0是:1
数组中的第1是:9
数组中的第2是:8
数组中的第3是:6
数组中的第4是:3
10>使用continue和break修改循环的行为
continue 能够调转到循环开头,即跳过本次循环,开始下一次循环
break 跳出循环语句
int numbers[5] = {1,9,8,6,3};
int a = 0;
for(int i : numbers){
std::cout << "数组中的第" << a << "是:" << i << std::endl;
a++;
if(numbers[a] == 8){
break;
}
}
使用函数组织代码
函数能够划分和组织程序的执行逻辑
函数原型 返回值类型 函数名 (函数参数);
1>函数定义 :函数的实现被称为函数定义
2>如果函数声明中包含形参,调用函数时必须提供实参
3>递归函数——调用自己的函数
在有些情况下,可让函数调用它自己,这样的函数称为递归函数,递归函数必须有明确的退出条件,满足这种条件后,函数将返回,而不再调用自己。
注意:如果没有存在退出条件或者存在bug,递归函数可能不断调用自己,直到栈溢出后停止,导致应用程序崩溃。
int GetFibNumber(int index){
if(index < 2){
return index;
}else{
return GetFibNumber(index - 1);
}
}
输出:
fidNumber :1
函数重载:名称和返回类型相同,但参数不同的函数被称为重载函数
const double PI = 3.1415926;
double Area(double radius){
return PI * radius * radius;
}
double Area(double radius,double height){
return 2 * Area(radius) + 2 * PI * radius * height;
}
cout << "圆的面积 :" << Area(10) << endl;
cout << "圆的面积2 :" << Area(5,2) << endl;
std::cout << "fidNumber :" << GetFibNumber(4) << std:
输出:
圆的面积 :314.159
圆的面积2 :219.911
将数组传递给函数
void DisplayInteger(int Number);
void DisplayInteger(int[] numbers,int Length);
按引用传递参数
void change(int a){
a = 10;
}
int main(){
int id = 2;
change(id);
cout << "查看id的值 :" << id << endl;
上述意味着函数调用不会影响main()中的变量,因为change()使用的是id包含的值的拷贝。
有时候,可能希望函数修改的变量在其外部中也可用,因此可将形参的类型声明为引用。
void change(int& a){
a = 12;
}
int main(){
int id = 2;
change(id);
cout << "查看id的值 :" << id << endl;
输出:
查看id的值 :12
引用的概念:
建立“引用”的作用是为一个变量起另一个名字,以便在需要时可以方便,间接的引用该变量,这就是变量名称的由来。对变量的引用的所有操作,实际上都是对其所代表的(原来的)变量的操作。
int a;
int &b = a;//声明b是一个整型变量的引用变量,它被初始化为a
关于引用的简单说明
(1)引用并不是一个独立的数据类型,它必须与某一种类型的数据相联系。声明引用时必须执定它代表的是哪个变量,即对它进行初始化。
int &b =a //正确,指定b是整型变量a的别名
int &b; //错误,没有指定b代表哪个变量
float a ;int&b = a; //错误,类型不符
(2)引用与所代表的变量共享同一内存单元,系统并不为引用另外分配存储空间。实际上,编译系统使引用和其代表的变量具有相同的地址。
int a = 12;
int& b = a;
cout << "查看a的地址:" << &a << "查看b的地址:" << &b << endl;
结果:地址相同
(3)当看到&a这样的形式时,怎样区别是声明引用还是取地址的操作?
请记住,当&a 的前面有类型符时(即int &a),它必然是对引用声明,如果前面没有类型符(如,p = &a),此时的&是取地址运算符。
(4)对引用的初始化,可以用一个变量名,也可以用另外一个引用。
//对引用的初始化
int c = 3;
int &d = c;
int &e = d;
将引用作为函数参数
(1)将变量名作为实参
传递是单向的,在执行函数期间形参值发生变化并不传回给实参,因为在调用函数时,形参和实参不是同一个存储单元。
下面的程序无法实现两个变量的值交换。
void swap(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
}
int i = 3, j = 5;
swap(i, j);
cout << "i = " << i << "j = " << j << endl; //i 和 j 未交换
(2)传递变量的指针,为了解决(1)中的问题,可以用传递变量地址的方法。使形参得到一个变量的地址,这时形参指针变量执向实参变量单元。
void swap(int* p1, int* p2) {
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
//地址的交换
swap(&i, &j);
cout << "i = " << i << "j = " << j << endl; //i 和 j 的值交换
(3) 传递变量的别名:利用引用实现两个变量的值的交换
void swap2(int& a, int& b) {
int temp;
temp = a;
a = b;
b = temp;
}
//使用引用进行变量的交换
swap2(i, j);
cout << "使用引用进行交换的结果 :" << "i = " << i << "j = " << j << endl; //i 和 j 的值交换
对引用的进一步说明
(1)不能建立void 类型的引用
void& a = 9 ;//错误
(2)不能建立引用的数组
char c[6] = “hello”;
char& rc[6] = c; //错误
原因:数组名c只代表数组首元素的地址,本身并不是一个占有存储空间的变量
(3)可以将变量的引用的地址赋给一个指针,此时指针执向的是原来的变量
int x = 3;
int& y = x;
int* p = &y;
cout << "指针代表的值" << *p << endl;//结果3
(4)可以建立指针变量的引用
//指针变量的引用
int q = 5;
int* w = &q;
int* &t = w;
cout << "输出的t的结果:" << *t << endl; // 结果5
(5)可以用const 对引用加以限定,不允许改变改引用的值
int i = 5;
const int &a = i;
a = 3;//企图改变引用a的值,错误