循环与程序控制结构

循环与程序控制结构

我们目前为止 程序都是从上往下 从左往右执行的。

有的时候,可能需要多次执行同一块代码。一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。

编程语言提供了允许更为复杂的执行路径的多种控制结构。

循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的一般形式:

C++ 提供四种基本循环方式,其实真正是三种 while ,do while 和for

后面我们逐一讲解

while 循环

只要给定的条件为真,while 循环语句会重复执行一个目标语句。

一般结构如下

while(condition)
{
   statement(s);
}Code language: JavaScript (javascript)

在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。

condition 可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。

当条件为假时,程序流将继续执行紧接着循环的下一条语句。

在这里,while 循环的关键点是循环可能一次都不会执行。当条件被测试且结果为假时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。

#include <iostream>
using namespace std;
 
int main ()
{
   // 局部变量声明
   int a = 10;

   // while 循环执行
   while( a < 20 )
   {
       cout << "a 的值:" << a << endl;
       a++;
   }
 
   return 0;
}Code language: PHP (php)

为了避免死循环 我们应该要在循环体里面 修改一些值 使得条件不成立。否则永远都会执行。

while(0)//非0就是true
{
	cout << "执行了循环" << endl;
}

int i = 0;
while (i<10)
{
	cout << i << endl;
	i++;
}
cout << "循环结束" << endl;Code language: JavaScript (javascript)

do…while 循环

不像 for 和 while 循环,它们是在循环头部测试循环条件。do…while 循环是在循环的尾部检查它的条件。

do…while 循环与 while 循环类似,但是 do…while 循环会确保至少执行一次循环。

一个是先判断后执行

一个是先执行后判断。

也就是 while是先判断条件 然后再看真假 执行循环体。如果条件一开始就是假 则一次都不会执行循环体。为真则执行循环体 然后再判断。

而do while 则先执行一次循环体 然后判断条件。如果条件为假 则 往下一条语句执行。为真则执行下一次循环体

do
{
   statement(s);

}while( condition );Code language: JavaScript (javascript)

请注意,条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。

如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止。

#include <iostream>
using namespace std;
 
int main ()
{
   // 局部变量声明
   int a = 10;

   // do 循环执行
   do
   {
       cout << "a 的值:" << a << endl;
       a = a + 1;
   }while( a < 20 );
 
   return 0;
}Code language: PHP (php)

下面是我们的代码

while(0)//while循环
{
	cout << "执行了while循环" << endl;
}

do
{
	cout << "执行了do while循环" << endl;
} while (0);Code language: JavaScript (javascript)

输出0-9 使用do while循环

int i = 0;
do
{
	cout << i << endl;
	++i;
} while (i<10);Code language: JavaScript (javascript)

do while和while的区别 例子演示

int i = 10;

//while (i<10)
//{
//	cout << i << endl;
//	++i;
//}

do
{
	cout << i << endl;
	++i;
} while (i<10);Code language: JavaScript (javascript)

for 循环

for 循环允许您编写一个执行特定次数的循环的重复控制结构

for ( init; condition; increment )
{
   statement(s);
}

下面是 for 循环的控制流:

init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。

接下来,会判断 condition。如果为真,则执行循环主体。

如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。是{}循环体后面的语句。

在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。

条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。

#include <iostream>
using namespace std;
 
int main ()
{
   // for 循环执行
   for( int a = 10; a < 20; a = a + 1 )
   {
       cout << "a 的值:" << a << endl;
   }
 
   return 0;
}Code language: PHP (php)
基于范围的for循环(C++11)
int my_array[5] = {1, 2, 3, 4, 5};
// 每个数组元素乘于 2
for (int &x : my_array)
{
    x *= 2;
    cout << x << endl;  
}
// auto 类型也是 C++11 新标准中的,用来自动获取变量的类型
for (auto &x : my_array) {
    x *= 2;
    cout << x << endl;  
}Code language: JavaScript (javascript)

我们的代码

for循环可以使用while循环来实现

看下面的例子 计算1到100的自然数之和

//计算1到100的自然数 之和
int sum = 0;
int i = 1;
while (i<=100)
{
	sum = sum + i;
	i++;
}
//当i=101就退出循环体
cout << sum << endl;Code language: JavaScript (javascript)

下面是使用for循环实现

int sum = 0;
for (int i = 1; i <=100; i++) //两个分号 隔开三部分 第一部分 通常用来初始化变量 第二部分是循环条件 第三部分是改变条件
{
	sum = sum + i;
}
cout << sum << endl;

//计算1到100的自然数 之和
int sum = 0;
int i = 1;
for (;i<=100;)//for循环的第一和第三部分可以不写 这时候就等同于 while循环
{
	sum = sum + i;
	i++;
}
//当i=101就退出循环体
cout << sum << endl;Code language: JavaScript (javascript)

嵌套循环

一个循环内可以嵌套另一个循环。C++ 允许至少 256 个嵌套层次。

比如 可以在while循环里面有while循环 再里面再有while循环 理论上 支持256层嵌套。

还可以是 for循环里面有while循环 或者while有for 或者dowhile 有while 反正就是这三种循环可以互相嵌套。

for ( init; condition; increment )
{
   for ( init; condition; increment )
   {
      statement(s);
   }
   statement(s); // 可以放置更多的语句
}Code language: JavaScript (javascript)

此外 while do while 也可以嵌套。

三种循环 也可以互相嵌套。

例子 计算2到100 之间的质数

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

就是除了1和本身可以整除 没有第三个数。

#include <iostream>
using namespace std;
 
int main ()
{
    int i, j;
    for(i=2; i<100; i++) {
        for(j=2; j <= (i/j); j++) {
            if(!(i%j)) {
                break; // 如果找到,则不是质数
            }
        }
        if(j > (i/j)) {
            cout << i << " 是质数\n";
        }
    }
    return 0;
}Code language: PHP (php)

60/2 = 30

31 32 –59

61/2=30

//60

// j = 2 30

// j = 3 20

// j = 4 15

//j = 5 12

//j = 6 10

//j 9 6

循环控制语句

在循环体里面 可以进行跳转。可以跳过本次循环 也可以跳出整个循环 。

如果我们希望在循环体内部 跳出循环 或者直接进入到下次循环 那么怎么办?

C++ 提供三个语句

break 语句

C++ 中 break 语句有以下两种用法:

当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。

它可用于终止 switch 语句中的一个 case。

如果您使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。也就是break 只能跳出它所在的最内层循环。

C++ 中 break 语句的语法:

break;

#include <iostream>
using namespace std;

int main()
{
	int a = 10;

	// do 循环执行
	do
	{
		cout << "a 的值:" << a << endl; //a在下面是16 但是在这里还是15
		a = a + 1;
		if (a > 15) //当a==16就会执行if里面的代码
		{
			// 终止循环
			break;
		}
	} while (a < 20);
	return 0;
}Code language: PHP (php)
#include <iostream>
using namespace std;

int main()
{
	//计算1到100 之间第一个能同时被3和5整除的数
	int i = 1;
	while (i <= 100)
	{
		if (i % 3 == 0 && i % 5 == 0)
		{
			cout << i << endl;
			break;
		}
		//cout << i << endl;
		i++;
	}
	return 0;
}Code language: PHP (php)
continue 语句

C++ 中的 continue 语句有点像 break 语句。但它不是强迫终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

对于 for 循环,continue 语句会导致执行条件测试和循环增量部分。

另外 一般执行break等语句都是有 if条件的 否则如果没有条件 那么循环就只能执行一次

int a = 10;

// do 循环执行
do
{
	cout << "a 的值:" << a << endl; //a在下面是16 但是在这里还是15
	a = a + 1;
	break;
} while (a < 20);
return 0;Code language: JavaScript (javascript)

对于 while 和 do…while 循环,continue 语句会导致程序控制回到条件测试上。

continue;

#include <iostream>
using namespace std;
 
int main ()
{
   // 局部变量声明
   int a = 9;

   // do 循环执行
   do
   {
       a = a + 1;
       if( a == 15)
       {
          // 跳过迭代
          continue;
       }
       cout << "a 的值:" << a << endl;
   }while( a < 20 );
 
   return 0;
}Code language: PHP (php)

我们的例子

#include <iostream>
using namespace std;

int main()
{
	int a = 10;

	// do 循环执行
	do
	{
		cout << "a 的值:" << a << endl; //a在下面是16 但是在这里还是15
		a = a + 1;
		if (a>15)
		{
			continue;
		}
		cout << "------" << endl;
	} while (a < 20);
	return 0;
}Code language: PHP (php)

continue的目的是跳过本次循环 不在执行下面的代码 直接到达判断条件 然后根据条件结果是否执行下次循环

goto 语句

goto 语句允许把控制无条件转移到同一函数内的被标记的语句。

注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。

goto 就好比 “虫洞” 一样 可以瞬间移动到另外一个位置。

语法结构

goto label;
..
.
label: 
statement;Code language: PHP (php)

在这里,label 是识别被标记语句的标识符,可以是任何除 C++ 关键字以外的纯文本。标记语句可以是任何语句,放置在标识符和冒号(:)后边。

#include <iostream>
using namespace std;
 
int main ()
{
   // 局部变量声明
   int a = 10;

   // do 循环执行
   LOOP:
   do
   {
       if( a == 15)
       {
          // 跳过迭代
          a = a + 1;
          goto LOOP;
       }
       cout << "a 的值:" << a << endl;
       a = a + 1;
   }while( a < 20 );
 
   return 0;
}Code language: PHP (php)

goto 语句一个很好的作用是退出深嵌套例程。例如,请看下面的代码片段:

goto可以跳出多层循环。不管怎么样 都是无条件

for(...) {
   for(...) {
      while(...) {
         if(...) goto stop;
         .
         .
         .
      }
   }
}
stop:
cout << "Error in program.\n";Code language: PHP (php)

我门的代码

#include <iostream>
using namespace std;

int main()
{
	cout << 1 << endl;
	cout << 2 << endl;
	goto bamn;
	cout << 3 << endl;
	cout << 4 << endl;
	cn:
	cout << 5 << endl;
	bamn:
	cout << 6 << endl;
	goto cn;
	return 0;
}Code language: PHP (php)

无限循环

如果条件永远不为假,则循环将变成无限循环。什么时候用到死循环?

通常在一些需要监测的地方,定时去读取某些数据,我们要开发一个闹钟,这时候我们可以使用死循环。不断去监测这个时间。如果时间到达这个设定的时间 那么就报时。

比如

while(true)
{

}Code language: JavaScript (javascript)

例子

#include <iostream>
using namespace std;

int main()
{
	while (true)
	{
		cout << "Foxdevelop" << endl;
	}
	return 0;
}Code language: PHP (php)

for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。

#include <iostream>
using namespace std;
 
int main ()
{
 
   for( ; ; )
   {
      cout<< "This loop will run forever.\n";
   }
 
   return 0;
}Code language: PHP (php)
#include <iostream>
using namespace std;

int main()
{
	for (;;) //使用两个分号 不写其他的表达式 也可以实现死循环
	{
		cout << "Foxdevelop" << endl;
	}
	return 0;
}Code language: PHP (php)
Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注