第二章:分支和循环
循环语句,是用于重复执行某条语句的语句。
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;
}
for语句执行的流程:
可以发现,表达式1,即初始化部分在整个流程中只被执行了1次。
看下面两段代码:
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关键字:
#include
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
printf("%d ", i);
}
return 0;
}
只要break被执行,循环终止。
在上述例子中,加入continue关键字:
#include
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
}
return 0;
}
运行结果:
可以发现打印结果跳过了5,打印出1,2,3,4,6,7,8,9。
并没有像while循环中出现死循环的情况。
这是因为for循环的调整部分不会被continue
跳过。
在continue跳过打印5之后,仍会执行i++,此时i = 6,不会陷入死循环。
while循环
中的continue
跳过剩余部分后,有可能跳过调整部分;
for循环
中的continue
跳过剩余部分后,直接跳至调整部分。
一些建议:
- 不可在for循环体内修改循环变量,防止for循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
尽量不要在for循环体内修改循环变量。
如果将上述代码修改为:
#include
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
i = 5;//修改循环变量
}
return 0;
}
在内部修改了循环变量,使代码“走不出去”。
所以尽量不要在循环体内修改循环变量(包括嵌套)。
尽量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;
}
运行结果都是一样的:
但是更建议写成前闭后开区间形式:
这里的10意味着循环了10次,代码风格和可读性更好。
#include
int main()
{
//省略判断部分 - 判断部分恒为真
for (;;)//不写
{
printf("666\n");
}
return 0;
}
由此可见for循环的初始化、条件判断和调整部分都是可以省略不写的。
但是判断部分的省略意味着判断部分恒为真,即陷入死循环。
#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;
}
如果省略初始化部分,那么将打印几次呢?
#include
int main()
{
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("666\n");
}
}
return 0;
}
这是因为i = 0执行第一次外循环时,直到内循环的j = 3
时将跳出内循环。
然后i = 1执行第二次外循环时,由于没有初始化j,导致j = 3
不满足循环的条件。
所以只执行了一次外循环!只打印了3次。
不要随便省略初始化!!
#include
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("666\n");
}
return 0;
}
请问循环要循环多少次?
#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语句,对循环语句有一个深入的了解。