第六章 C++ 控制结构

结构化程序可以由顺序,分支,循环三种基本控制结构组成。控制结构存在的意义在于,能够让我们开发人员自定义代码的执行顺序。我们之前多次使用的函数,也可以理解为一种控制结构。当我们调用函数的时候,程序会跳到该函数体内的代码,代码执行完毕后再次回到主程序函数调用处。

顺序结构是一种最简单的基本结构,其执行过程就是从上到下一次执行每行代码。分支结构的程序根据判断条件的不同执行不同的代码块。循环结构的程序是根据判断条件是否成立,不断重复执行某个代码块。代码块就是由一对花括号包裹的多行代码,作为一个逻辑单元完成特定功能。

C++语言分支控制结构主要是if语句和switch语句,语法结构如下:

if ( < 表达式 > )

       < 代码块1 >

else

       < 代码块2 >

ifelse都是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]

}

switchcasebreak都是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语句)。除此之外,还有breakcontinue语句用于结束所有循环和结束本次循环。下面是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游戏引擎的学习。课程中如果有一些错误的地方,请大家留言指正,感激不尽!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咆哮的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值