【教程】C++语言基础学习笔记(四)——流程控制

文首标志
写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!


【C++语言基础学习】系列文章

第一章 《项目与程序结构》
第二章 《数据类型》
第三章 《运算符》
第四章 《流程控制》
第五章 《Vector向量》
第六章 《String字符串》
第七章 《Array数组》
第八章 《函数》
第九章 《指针》
第十章 《结构体》



一、作用域和块

作用域(Scope)是指在程序中定义的变量、函数、对象等实体的可见范围或有效区域,一旦超过作用域,所定义的变量、函数、对象等实体就无法继续使用。
程序的作用域是自顶向下定义的,在最上级首先是全局作用域,在全局作用域定义的变量可以在文件中的所有地方被访问,也叫全局变量,而其他非全局的变量则叫做局部变量;而在其下,使用{}可以定义一个个块,每个块都定义了一层的作用域,而块中又能嵌套,由此形成了作用域的结构。
作用域的存在使得程序中的实体可以根据需要进行隔离和封装,并提供了良好的命名规则和可见性控制。
使用test.cpp的下列代码实验。

#include "test.h"
#include <iostream>

using namespace std;

int scopeVariable = 0;

void test::Test1()
{
	int scopeVariable = 2;
	cout << "块中变量:" << scopeVariable << endl;
	{
		int scopeVariable = 3;
		cout << "第二层块中变量:" << scopeVariable << endl;
	}
}

void test::Test2()
{
	cout << "全局作用域中变量:" << scopeVariable << endl;
}

在上面的代码中,定义了多个scopeVariable的变量,第一个是在全局作用域中定义的,第二个则是定义在块作用域中,第三个则定义在第二层的块作用域中。
返回结果如下。

块中变量:2
第二层块中变量:3

从返回结果来看,第一个定义的全局变量由于在块作用域中再次定义,输出结果返回自己所在的作用域中变量最后一次更新的值。

二、语句分类

在编程中,可以将代码分为两种类型的语句:简单语句和复合语句。

(一)简单语句

简单语句(Simple statement)是执行单个操作的语句。它们通常以分号结尾。常见的简单语句包括赋值语句、函数调用语句、循环控制语句(如break和continue)、返回语句等。简单语句在执行完毕后会直接跳到下一条语句。
下面是简单的示例。

int x = 10;  // 赋值语句
printHello();  // 函数调用语句

(二)复合语句

复合语句(Compound statement),也被称为代码块或者语句块,是由一对花括号{}包围的一组语句。复合语句可以包含多个简单语句,它们被视为一个整体。复合语句通常用于控制结构(如条件语句、循环语句)中,也可以用于定义局部变量。在执行复合语句时,其中的语句会按照它们出现的顺序依次执行。
下面是简单的示例。

{
    int num = 5;  // 定义局部变量
    for (int i = 0; i < num; i++) {
        cout << i << endl;
    }
    cout << "循环结束" << endl;
}

三、条件语句

条件语句是编程语言中的一种语法结构,用于根据给定条件的真假选择性地执行不同的代码块。
条件语句由条件表达式和被控制的代码块组成。条件表达式是一个布尔表达式,它返回真或假的值,用于判断代码块是否应该执行。根据条件表达式的结果,条件控制语句会有不同的执行路径。
条件语句分为if语句、switch语句和三元运算符? :,接下来主要介绍if语句和switch语句。

(一)if语句

if语句是一种条件控制语句,用于根据给定的条件选择性地执行特定的代码块。

1.if关键字

if语句的语法如下。

if (条件表达式) {
    // 条件为真时执行的代码块
}

下面是简单的示例。

if (a > 3)
{
	int b = 2;
}

上面代码的if语句就表示当a变量小于3时,才会执行创建一个值为2的整型变量b这个操作。

2.else关键字

同时,由于判断条件是一个布尔表达式,除了可以用if关键字设置条件为true时执行的操作,还可以用else关键字设置条件为false时执行的操作。其语法如下。

if (condition) {
    // 条件为真时执行的代码块
} else {
    // 条件为假时执行的代码块(可选)
}

下面是简单的示例。

if (a > 3)
{
	int b = 2;
} else {
	int b = 5;
}

承接上一个示例,此时的if语句则表示当a值大于3时使得b=2,而a值不大于3时则使得b=5。

3.else if关键字

elseif语句是在if语句和else语句之间的一个可选部分,用于在多个条件之间进行选择。其允许了if语句除了主要的判断条件外,还可以设立在主要判断条件内多个可选条件,并根据多个条件判断来选择执行不同的代码块。其语法如下。

if (条件表达式1) {
    // 条件1为真时执行的代码块
} else if (条件表达式2) {
    // 条件2为真时执行的代码块
} else if (条件表达式3) {
    // 条件3为真时执行的代码块
} else {
    // 所有条件都为假时执行的代码块
}

下面是简单的示例。

if (a > 3)
{
	int b = 2;
} else if (a == 2) {
	int b = 4;
} else {
	int b = 5;
}

此时if语句当a大于3时使得b=2不变,但在剩余a不大于3的情况中,else if使得当a等于2时使得b=4,其余情况才使得b=5。

4.if嵌套

if嵌套指的是在if语句的代码块中再嵌套使用一个或多个if语句。通过嵌套的if语句,可以根据不同的条件执行不同的代码块,实现更复杂的条件控制。其语法如下。

if (条件表达式1) {
    // 条件1为真时执行的代码块
    if (条件表达式2) {
        // 条件1为真且条件2为真时执行的代码块
    } else {
        // 条件1为真且条件2为假时执行的代码块
    }
} else {
    // 条件1为假时执行的代码块
}

使用test.cpp的下列代码实验。

#include "test.h"
#include <iostream>

using namespace std;

void test::Test()
{
	int num = 10;

	if (num > 0) {
		cout << "数字是正数" << endl;
		if (num % 2 == 0) {
			cout << "数字是偶数" << endl;
		}
		else {
			cout << "数字是奇数" << endl;
		}
	}
	else {
		cout << "数字不是正数" << endl;
	}
}

返回结果如下。

数字是正数
数字是偶数

以上的if语句会先判断数字正负性,是正数时才会继续判断数字的奇偶性。由于创建的变量num为10,所以返回正数和偶数的判断。

(二)switch语句

switch语句是一种在编程中用于多重条件分支的控制结构。它可以根据表达式的值,在一系列可能的值中选择要执行的代码块。其语法如下。

switch (表达式) {
    case1:
        // 当表达式的值等于值1时执行的代码块
        break;
    case2:
        // 当表达式的值等于值2时执行的代码块
        break;
    // 可以有更多的case语句
    default:
        // 当表达式的值与前面所有的值都不匹配时执行的代码块
        break;
}

switch语句开头的括号中是一个表达式,而其下面的每个case都是这个表达式可能得到的值。而每个代码块结束时,要使用break终止switch语句的执行。如果省略了break语句,程序将会继续执行后续case的代码块,直到遇到break或switch语句结束。
case后面必须是常整型(包括字符型和布尔型),如果不是常量整数,编译器在编译时就无法确定分支条件,也就失去了switch语句优化的好处。
如果表达式的值与所有的case都不匹配,那么会执行default后面的代码块(可选),其效果和if语句的else相似。default通常用于处理未匹配到任何case的情况。default部分可以放在switch语句的任意位置,也可以省略。
下面是简单的示例。

	int num = 3;
	switch (num)
	{
	case 0:
		cout << "零" << endl;
		break;
	case 1:
		cout << "一" << endl;
		break;
	case 2:
		cout << "二" << endl;
		break;
	case 3:
		cout << "三" << endl;
		break;
	case 4:
		cout << "四" << endl;
		break;
	case 5:
		cout << "五" << endl;
		break;
	default:
		cout << "数字不属于0~5的整数" << endl;
		break;
	}

以上代码的switch语句中,变量num属于表达式,当num等于0到5的整数时,不同的情况会输出对应的汉字;而当num不属于0到5的整数时,则返回“数字不属于0~5的整数”提示。

三、循环语句

循环语句是一种在编程中用于重复执行特定代码块的控制结构。它允许执行一系列语句多次,直到满足指定的终止条件为止。

(一)while循环

while循环用于在满足条件的情况下重复执行一段代码块,直到条件变为假为止。其语法如下。

while (条件) {
    // 代码块
}

下面是简单的示例。

int i = 0;
while (i < 10)
{
	cout << "i:" << i << endl;
	i++;
}

定义一个i=0的变量,while循环会在i<10的条件下一直执行下面的代码块。值得注意的是,由于i永远小于10,为了避免此代码进入死循环,通常会令i变量自加(每次加1),于是while循环语句内部的代码块每循环一次,i的值都会增加1,等到i=10时循环即可自动停止。
返回结果如下。

i:0
i:1
i:2
i:3
i:4
i:5
i:6
i:7
i:8
i:9

如此,代码正好循环了10次。

(二)do-while循环

do-while循环是一种后测试循环结构,它先执行一次循环体中的代码块,然后在每次循环结束后检查条件是否为真。如果条件为真,则继续执行循环,否则退出循环。其语法如下。

do {
    // 代码块
} while (条件);

相比于while循环,do-while循环是从do关键字开始的,不同于while循环的先判断再执行,do-while循环先至少执行一遍代码块,再通过while关键字判断条件是否为真以决定是否继续执行代码块。
仿照while循环的示例。

int i = 0;
do
{
	cout << "i:" << i << endl;
	i++;
} while (i < 10);

其返回结果与while循环示例相同。

(三)for循环

for循环的语法结构如下。

for (初始化表达式; 循环条件; 更新表达式) {
    // 循环体
}

for循环对于编程者来说是比上两个循环更加常用的循环结构,之所以更加被青睐,是因为通常循环需要的初始化变量和更新条件在for循环语句中就可以设置。

for (int i = 0; i < 10; i++)
{
	cout << "i:" << i << endl;
}

同样的示例,返回结果与while循环和do-while循环相同,但代码更为简洁。
在此基础上,循环间同样可以嵌套。下面是一个for循环嵌套实现九九乘法表的经典示例。

// 九九乘法表
for (int i = 1; i < 10; i++)
{
	for (int j = 1; j < 10; j++)
	{
		cout << i << "x" << j << "=" << i * j << " ";
	}
	cout << endl;
}

返回结果如下。

1x1=1 1x2=2 1x3=3 1x4=4 1x5=5 1x6=6 1x7=7 1x8=8 1x9=9
2x1=2 2x2=4 2x3=6 2x4=8 2x5=10 2x6=12 2x7=14 2x8=16 2x9=18
3x1=3 3x2=6 3x3=9 3x4=12 3x5=15 3x6=18 3x7=21 3x8=24 3x9=27
4x1=4 4x2=8 4x3=12 4x4=16 4x5=20 4x6=24 4x7=28 4x8=32 4x9=36
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25 5x6=30 5x7=35 5x8=40 5x9=45
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 6x7=42 6x8=48 6x9=54
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 7x8=56 7x9=63
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 8x9=72
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81

四、跳转语句

跳转语句是一种用于改变程序执行流程的语句,它可以让程序从一个位置无条件地转移到另一个位置。

(一)break语句

break语句用于终止循环或switch语句的执行并跳出当前代码块。在switch语句中使用break语句可以跳出switch块,继续执行switch语句后面的代码。这一点在switch语句中的介绍中已经演示过。
而在循环中也可以使用break语句,目的是立即终止当前循环的执行,并执行循环后面的代码。在循环中使用break语句如下。

for (int i = 0; i < 10; i++)
{
	cout << i << endl;
	if (i > 5)
	{
		break;
	}
	cout << "在if语句外" << endl;
}
cout << "跳出循环" << endl;

返回结果如下。

0
在if语句外
1
在if语句外
2
在if语句外
3
在if语句外
4
在if语句外
5
在if语句外
6
跳出循环

可见,break所在的if循环在第六次for循环开始后,由于i已经加到6,满足了if语句的i > 5的条件,随即执行break语句跳出了for循环,执行了for循环之后的打印“跳出循环”的操作。

(二)continue语句

continue语句用于跳过当前迭代周期的剩余代码,并继续执行下一次迭代。

for (int i = 0; i < 10; i++)
{
	cout << i << endl;
	if (i > 5)
	{
		continue;
	}
	cout << "在if语句外" << endl;
}
cout << "跳出循环" << endl;

返回结果如下。

0
在if语句外
1
在if语句外
2
在if语句外
3
在if语句外
4
在if语句外
5
在if语句外
6
7
8
9
跳出循环

将上一个示例中的break更改为continue,可以看到continue的作用令for循环在满足if语句的条件下没有执行下面if语句外的操作,直到循环结束。

(三)goto语句

goto语句可以将程序的控制无条件地转移到代码中指定的标签所在的位置。
下面是简单的示例。

{
	goto here;
	cout << "本来应该打印的" << endl;
here:
	cout << "goto令其打印的" << endl;
}

返回结果如下。

goto令其打印的

可以看到,goto所定义的here令代码执行过程直接跳过“本来应该打印的”打印操作,直接转向了here:后面的打印操作。
然而使用goto语句时需要谨慎,因为滥用goto语句可能导致代码结构混乱,难以理解和维护。


我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!

文末标志

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值