[简明C语言]分支和循环P_4:循环 - for语句

[简明C语言]分支和循环P_4:循环 - for语句

  • 前言
  • 1. for语句
    • 执行流程图
    • 对比for循环和while循环。
    • break关键字
    • continue关键字
  • 2. for语句的循环控制变量
    • 建议1
    • 建议2
  • 3. for循环的变种
    • 变种1
    • 变种2
    • 变种3
  • 4. 题目
  • 总结


前言

第二章:分支和循环

循环语句,是用于重复执行某条语句的语句。

for循环语句的循环方式为利用一个条件来控制是否要继续反复执行这个语句,它是计算机的一种基本循环模式。当满足条件时进入循环,不满足跳出。


1. for语句

上一部分详细讲解了while循环,介绍了为什么需要for循环。

首先通过一段伪代码看一下for循环的语法:

for(表达式1;表达式2;表达式3)
	循环语句;

表达式1初始化部分,用于初始化循环变量。
表达式2条件判断部分,用于判断循环什么时候终止。
表达式3调整部分,用于循环条件的调整。

来看一段实际应用。

使用for循环打印1-10十个数字:

#include 

int main()
{
	int i = 0;
	//for(i=1/*初始化*/;i<=10/*判断部分*/;i++/*调整部分*/)
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

运行结果:
[简明C语言]分支和循环P_4:循环 - for语句_第1张图片
可以看到成功打印出了1-10十个数字。

执行流程图

for语句执行的流程:
[简明C语言]分支和循环P_4:循环 - for语句_第2张图片
可以发现,表达式1,即初始化部分在整个流程中只被执行了1次

对比for循环和while循环。

看下面两段代码:

int i = 0;
//实现相同的功能,使用while
i = 1;//初始化部分
while(i <= 10)//判断部分
{
	printf("%d ", i);
	i = i + 1;//调整部分
}

//实现相同的功能,使用for
for(i = 1; i < 11; i++)
{
	printf("%d ", i);
}

可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。

所以,for循环的风格更胜一筹;for循环使用的频率也最高。

break关键字

在上述例子中,加入break关键字:

#include 

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
		{
			break;
		}
		printf("%d ", i);
	}
	return 0;
}

运行结果
[简明C语言]分支和循环P_4:循环 - for语句_第3张图片
i = 5的时候终止循环,打印出1,2,3,4。

只要break被执行,循环终止。

continue关键字

在上述例子中,加入continue关键字:

#include 

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ", i);
	}
	return 0;
}

运行结果:
[简明C语言]分支和循环P_4:循环 - for语句_第4张图片
可以发现打印结果跳过了5,打印出1,2,3,4,6,7,8,9。
并没有像while循环中出现死循环的情况。

这是因为for循环的调整部分不会被continue跳过。

在continue跳过打印5之后,仍会执行i++,此时i = 6,不会陷入死循环。

while循环中的continue跳过剩余部分后,有可能跳过调整部分;
for循环中的continue跳过剩余部分后,直接跳至调整部分。


2. for语句的循环控制变量

一些建议:

  1. 不可在for循环体内修改循环变量,防止for循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

建议1

尽量不要在for循环体内修改循环变量。
如果将上述代码修改为:

#include 

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
		i = 5;//修改循环变量
	}
	return 0;
}

运行发现“:
[简明C语言]分支和循环P_4:循环 - for语句_第5张图片
出现了死循环!

在内部修改了循环变量,使代码“走不出去”。

所以尽量不要在循环体内修改循环变量(包括嵌套)。

建议2

尽量for语句的循环控制变量的取值采用“前闭后开区间”写法。

前闭后开区间:

#include 

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	for (i = 1; i < 10; i++)//前闭后开区间
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

前后闭区间:

#include 

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	for (i = 1; i <= 9; i++)//前后闭区间
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果都是一样的:
[简明C语言]分支和循环P_4:循环 - for语句_第6张图片
但是更建议写成前闭后开区间形式:
10
这里的10意味着循环了10次,代码风格和可读性更好。


3. for循环的变种

变种1

#include 

int main()
{
	//省略判断部分 - 判断部分恒为真
	for (;;)//不写
	{
		printf("666\n");
	}
	return 0;
}

运行结果为:
[简明C语言]分支和循环P_4:循环 - for语句_第7张图片
可见在循环打印。

由此可见for循环的初始化、条件判断和调整部分都是可以省略不写的。

但是判断部分的省略意味着判断部分恒为真,即陷入死循环。

变种2

#include 

int main()
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("666\n");
		}
	}
	return 0;
}

运行结果:
[简明C语言]分支和循环P_4:循环 - for语句_第8张图片
外循环3次,内循环3次,共打印9次。

如果省略初始化部分,那么将打印几次呢?

#include 

int main()
{
	int i = 0;
	int j = 0;
	for (; i < 3; i++)
	{
		for (; j < 3; j++)
		{
			printf("666\n");
		}
	}
	return 0;
}

运行结果:
[简明C语言]分支和循环P_4:循环 - for语句_第9张图片
只打印了3次,为什么呢?

这是因为i = 0执行第一次外循环时,直到内循环的j = 3时将跳出内循环。

然后i = 1执行第二次外循环时,由于没有初始化j,导致j = 3不满足循环的条件。

所以只执行了一次外循环!只打印了3次

不要随便省略初始化!!

变种3

#include 

int main()
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("666\n");
	}
	return 0;
}

运行结果
[简明C语言]分支和循环P_4:循环 - for语句_第10张图片
可以发现,使用两个循环变量来控制变量也是可以的。


4. 题目

请问循环要循环多少次?

#include 

int main()
{
	int i = 0;
	int k = 0;
	for(i = 0, k = 0; k = 0; i++, k++)
	{
		k++;
	}
	return 0;
}

代码中条件判断部分k = 0赋值
代表着把0赋值给k
0为假

因为条件判断部分为!!
所以根本没有进入循环!!

总结

本文详细介绍了循环语句中的for语句,对循环语句有一个深入的了解。

你可能感兴趣的:(#,第二章:分支语句和循环语句,c语言,算法)