结构化程序可以由顺序,分支,循环三种基本控制结构组成。控制结构存在的意义在于,能够让我们开发人员自定义代码的执行顺序。我们之前多次使用的函数,也可以理解为一种控制结构。当我们调用函数的时候,程序会跳到该函数体内的代码,代码执行完毕后再次回到主程序函数调用处。
顺序结构是一种最简单的基本结构,其执行过程就是从上到下一次执行每行代码。分支结构的程序根据判断条件的不同执行不同的代码块。循环结构的程序是根据判断条件是否成立,不断重复执行某个代码块。代码块就是由一对花括号包裹的多行代码,作为一个逻辑单元完成特定功能。
C++语言分支控制结构主要是if语句和switch语句,语法结构如下:
if ( < 表达式 > )
< 代码块1 >
else
< 代码块2 >
if和else都是C++关键字,表达式的结果一定是一个逻辑布尔值。如果表达式结果为true,则执行 <代码块1>;如果表达式结果为false,则执行<代码块2>。如果<代码块1>有多条执行语句,可以放在{ }之间,构成复合语句(代码块)。
// 分支if/else讲解
int x = 10;
int y = 0;
// 单if情况
if (x > 10) y = 15;
std::cout << y << std::endl; // 输出 0
// if/else连用情况
if (x > 10) y = 15;
else y = 5;
std::cout << y << std::endl; // 输出 5
// if/else代码块情况
if (x == 10)
{
x = 15;
y = 15;
std::cout << "x=" << x << ", y=" << y << std::endl; // 输出 15
}
else
{
x = 5;
y = 5;
std::cout << "x=" << x << ", y=" << y << std::endl; // 输出 5
}
// if/else嵌套使用情况
if (x > 0) {
if (y > 0) {
std::cout << "x>0 && y>0" << std::endl;
}
else {
std::cout << "x>0 && y<=0" << std::endl;
}
}
switch语法结构如下:
switch ( <表达式> )
{
case <常量表达式1> :[代码块1] [break;]
case <常量表达式2> :[代码块2] [break;]
case <常量表达式3> :[代码块3] [break;]
……
default :[代码块n]
}
switch,case,break都是C++语言的关键字,switch表达式的结果值只能是整数,字符型或者枚举类型。每个常量表达式的结果值必须各不相同。当switch表达式的结果值与某个常量表达式的值匹配相等时候,就会执行后面的代码块。如果没有匹配相等任何一个常量表达式,则会执行default后面的代码块,当然default语句不是必须存在的。case分支仅仅起到一个入口的作用,并不具有结束switch语句的功能,如果想结束剩余case语句使用break即可,它会跳出整个switch语句。
// switch分支讲解
int m = 8, n = 0;
switch (m % 3) {
case 1 :
n = 10;
break;
case 2 :
n = 20;
break;
case 3 :
n = 30;
break;
default:
n = 0;
}
std::cout << "switch: " << n << std::endl;
// 字符类型
char z = 'w';
int run = 0;
switch (z) {
case 'w':
run += 10;
break;
case 'a':
run -= 10;
break;
case 's':
run += 20;
break;
case 'd':
run -= 20;
}
std::cout << "switch: " << run << std::endl;
if-else和swith都是分支结构,他们的区别在于表达式的结果值是否可能包含多个。如果表达式的结果值只有2-3种的话,使用if-else语句代码逻辑会比较清晰,相反的,使用swith语句代码逻辑会更好一些,但是我们也可以仍然坚持使用if-else语句,也是可以的。
C++的循环控制语句有三种:计数型循环语句(for语句),当型循环语句(while语句)和直到型循环语句(do…while语句)。除此之外,还有break,continue语句用于结束所有循环和结束本次循环。下面是for循环语句的语法:
for ( <表达式1>; <表达式2>; <表达式3> )
< 循环体 >
表达式1用于循环变量赋初值,表达式2为循环判断条件,表达式3对循环变量进行修改。循环体可以是单语句,也可以是花括号包裹的复合语句。优先执行<表达式1>,也就是初始化变量i,然后判断<表达式2>的结果,如果是ture的话,则执行< 循环体语句 >。执行循环体语句之后,再执行<表达式3>,再判断<表达式2>的结果,如果true的话,则再次执行< 循环体语句 >,以此类推,循环执行<表达式3>后判断<表达式2>的结果,根据结果来决定是否执行< 循环体语句 >。
// 简单for循环,计算1到100的和
int result = 0;
for (int i = 1; i <= 100; i++) {
result += i;
}
std::cout << "result: " << result << std::endl; // 输出 5050
// for循环联合if/else,计算1到100的偶数和和奇数和
int res1 = 0, res2 = 0;
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
res1 += i;
}else {
res2 += i;
}
}
std::cout << "res1: " << res1 << std::endl; // 输出 2450
std::cout << "res2: " << res2 << std::endl; // 输出 2500
// for循环的退出
int res3 = 0;
for (int i = 1; i <= 100; i++) {
// 退出所有循环
if (res3 >= 1000) break;
// 退出本次循环,执行下次循环
if (i % 2 == 0) continue;
// 累加奇数和,但是和大于1000之后就退出循环
res3 += i;
}
std::cout << "res3: " << res3 << std::endl; // 输出 1024
// for循环打印99乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
std::cout << i << "×" << j << "= " << i*j << " ";
}
std::cout << std::endl;
}
while ( <表达式> )
< 循环体语句 >
表达式为循环条件,可以是任意合法的逻辑或关系表达式。如果表达式的结果为true,则执行< 循环体语句 >,然后再次计算表达式结果,如果为true,则继续执行< 循环体语句 >,如果为false的话,则结束循环。一般情况下,< 循环体语句 >中都会有影响<表达式>结果的代码语句。但是,如果第一次计算表达式的值就是false的话,那么< 循环体语句 >那永远不会执行了!
int i = 1;
int res4 = 0;
while (i <= 100) {
res4 += i;
i++;
}
std::cout << "res4: " << res4 << std::endl; // 输出 5050
do
< 循环体语句 >
while (<表达式> )
do…while的循环结构和while循环结构大致相同,区别在于do…while的循环体语句至少会执行一次,尽管表达式的结果值是false。因为它是先执行循环体,然后在判断循环表达式。
int j = 1;
int res5 = 0;
do {
res5 += j;
j++;
} while (j < 0);
std::cout << "res5: " << res5 << std::endl; // 输出 1
备注:在循环结构中,一定要有退出循环的条件能够出现,否则就是无限循环(死循环),无限循环很可能会导致内存溢出,程序崩溃。
本课程的所有代码案例下载地址:
C++示例源代码(配合教学课程使用)-C/C++文档类资源-CSDN下载
备注:这是我们游戏开发系列教程的第一个课程,主要是编程语言的基础学习,优先学习C++编程语言,然后进行C#语言,最后才是Java语言,紧接着就是使用C++和DirectX来介绍游戏开发中的一些基础理论知识。我们游戏开发系列教程的第二个课程是Unity游戏引擎的学习。课程中如果有一些错误的地方,请大家留言指正,感激不尽!