持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
2.for
for (表达式; 表达式; 表达式) { 循环语句; }
已经学习了while循环了,为什么还要学习for循环?或者说while循环有什么缺陷?
#include<stdio.h>
int main01()
{
int i = 1;//初始化部分
//...
//...
while (i <= 10)//判断
{
printf("%d ", i);
}
//...
//...
i++;//调整
//在未来写的代码越来越多的时候,这三个部分可能会隔的比较远,导致更改或阅读不方便
return 0;
}
//for循环很好的规避了这个问题 - 它把初始化、判断、调整三个部分放到了一个括号里
//for(表达式; 表达式; 表达式)
//for(初始化; 判断; 调整)
//看代码:使用for循环打印1-10
int main02()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
for循环中的break和continue
#include<stdio.h>
int main01()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
break;
printf("%d ", i);//1 2 3 4
}
//5==5为真,终止所在的for循环
return 0;
}
int main02()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
continue;
printf("%d ", i);//1 2 3 4 6 7 8 9 10
}
//这里并没有跳过调整部分i++,所以不会死循环;而while循环中的continue很可能会跳过调整部分,造成死循环
return 0;
}
使用for循环的建议及注意 1.不可在for循环内修改循环变量,防止for循环失去控制
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
i = 5;// - err:死循环的原因
}
return 0;
}
2.建议for语句的循环控制变量的取值采用“前闭后开区间的写法”
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
//不建议写成for(i=0;i<=9;i++) - 前闭后闭区间 - 并不是这种写法是错的 - 而是说可读性相对来说较差
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
3.for循环中关于定义初始化问题
#include<stdio.h>
int main()
{
//这里是把i定义到了for循环内部
for (int i = 0; i < 10; i++)
{
printf("%d ", i);
}
//发现在VS2017中运行没有问题,其实这种写法是C++的语法。虽然可以运行,但是在其它平台上可能会造成跨平台的问题
return 0;
}
for循环的一些其它形式 1.
#includ<stdio.h>
int main()
{
//for循环的初始化、判断、调整都可以省略,语法是支持的 - 但不建议
//判断部分的省略 - 恒为真 - 死循环
for (;;)
{
printf("hehe\n");
}
return 0;
}
先看代码:共输出了多少“hehe”
#include<stdio.h>
int main01()
{
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("hehe\n");//共打印9个"hehe"
}
}
return 0;
}
//拿上面的代码来说:因为已经定义了i和j,所以将for循环里的i=0和j=0省略?
int main02()
{
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("hehe\n");//共打印3个"hehe"
}
}
//这里当i=0时,在内层循环输出3个“hehe”后;i=1,此时这里的j=3,并没有被重新初始化为0
return 0;
}
#include<stdio.h>
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("hehe\n");//输出2个“hehe”
}
return 0;
}
小试牛刀 - 问循环循环多少次
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
{
k++;
}
//因为k=0为假,所以不会进入到循环内部
return 0;
}
3.do while
do { 语句; }while(表达式);
这个语句很有个性比较喜欢先斩后奏 - 先执行后判断
打印1-10
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
do...while循环中的break和continue
#include<stdio.h>
int main01()
{
int i = 1;
do
{
if (5 == i)
break;
printf("%d ", i);//1 2 3 4
i++;
} while (i <= 10);
return 0;
}
int main02()
{
int i = 1;
do
{
if (5 == i)
continue;
printf("%d ", i);//1 2 3 4...死循环
i++;
} while (i <= 10);
//当5==5为真时,它会跳过调整部分i++,到判断部分
return 0;
}
do...while循环的特点:循环至少执行1次,使用的场景有限,所以不是经常使用