首先在这里先和大家说明一下到现在才更新的原因吧。前一段时间,我在忙考研的调剂,或许是命中注定,我与南邮差了点缘分,差一分进复试。计算机考研的内卷相信大家都有所耳闻,在之后的调剂中,本人也是顺利的没有被任何学校看中。人生当中,成功只是暂时的,失败却是主旋律,而如何面对失败则把人分成了三六九等,既然往事已成定局,那就应当立足当下,提升自己。
接下来,废话不多说,进入今天的正题:循环语句。
目录
一、什么是循环
在介绍循环语句之前,我们首先要了解一下何为循环。在之前的介绍中,我们所提及的分支语句,是一种类似于线性结构的语句,一次判断一次执行,判断成立则执行,判断不成立则不执行,且只执行一次。但我们在实际编程中其实还会遇到一种情况:同一事件需要重复数次。这时候就需要用到我们今天所提到的循环语句。
二、循环语句:while
老规矩,先上代码
#include <stdio.h>
int main()
{
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int key = 0;
scanf("%d", &key);
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left == right)
{
printf("找不到!\n")
}
return 0;
}
上述代码是一个经典的有序数组的二分查找。以此代码为例,我们可以看出,while语句有着和if语句相同的判断语句,二者的不同之处是:如果条件成立,if语句执行一次,而while语句则一直执行。因此,对于while语句来说,有一个重要的点:在循环中,满足某一条件后跳出循环。在二分查找中,left和right分别指向所要查找的数组两端,在每一次查找失败后,向中间靠拢,直到不满足left < right这个条件跳出,如果期间查找成功,则可以通过break直接跳出循环。而类似的continue也有跳出循环的功能,只不过continue只是跳出当前一次循环,如果判断语句依然成立,则循环继续执行,break则视为判断语句不成立,结束循环。在实际编程中,我们可以将判断语句写成1,即while(1),循环可以一直进行,然后通过break来跳出循环。
#include <stdio.h>
int main()
{
int i = 0;
int count = 0;
while (i < 10)
{
i++;
if (5 == i)
{
continue;
}
printf("%d ", i);
}
return 0;
}
上述代码输出结果为:1 2 3 4 6 7 8 9。以此为例,我们可以清楚地看出continue在循环中的作用,即当 i 为5时跳过本次循环后续的打印。值得一提的是,若i++语句写在了if语句的后面,则此程序会陷入死循环,原因是:当 i 为5时跳过了i++,i 的值永远为5。
三、循环语句:for
类似于while循环,for循环也是可执行多次的语句。其不同之处在于for循环一开始就给定了初值、判断条件以及调整部分,相较于while循环而言,for循环将循环的三个必须条件放在了一起,代码风格更胜一筹,因此使用频率最高。在for循环中也存在break和continue的,作用与在while循环中相似,再次不再赘述。接下来看一段代码:
int main()
{
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = 0;
}
return 0;
]
以上述代码为例,for循环一般常用于遍历,包括对数组的遍历以及一组数据的遍历等。从代码风格来看,我们一般会写成for (i = 0; i < sz; i++),而不会写成for (i = 1; i < sz + 1; i++)。二者虽然从本质上来看是完全一致的,但前者能够更好地看出循环执行了多少次。对于for循环,还有两个值得注意的点,一是在循环内部,不能对循环变量 i 进行修改,以防止循环失控。二是初始化部分、判断部分和调整部分是可以省略的,但省略的意义不大,不做研究。
最后再补充一点,在vs编译器中可以通过打出for+Tab键快速打出for循环。
四、循环语句:do while
从上述的逻辑来看do while循环与while循环的区别就是:无论如何,do while循环都会执行一次,while循环如果一开始条件就不成立,就一次也不会进入循环。
#include <stdio.h>
int main()
{
int input = 0;
do
{
scanf("%d", &input);
printf("%d\n", input);
} while (input);
return 0;
}
以上述代码为例,即使我们一开始的输入值为0,不满足判断条件,也依然会执行一次打印指令,如果是while循环,若输入值为0,则程序直接结束。do while循环中也可使用break和continue,用法与之前类似。不难看出,do while循环相较于while循环和for循环,使用场景有限,因而不经常使用。最后说明一点:do while循环在最后一定一定一定记得要加上分号!
五、循环中的奇葩:goto
无论是while循环、for循环还是do while循环都有对应的平判断语句和跳出循环的条件,但是这些对于我们最后要介绍的这个循环中的奇葩:goto来说,一个都不需要。
#include <stdio.h>
#include <string.h>
int main()
{
char password[20] = {0};
int n = 3;
Again:
printf("请输入密码:)\n");
scanf("%s", password);
if (strcmp(password,"qwer1234asdf") == 0)
{
printf("密码输入正确!\n");
}
else
{
n--;
if (0 == n)
{
printf("错误次数过多,请稍后重试!\n");
}
else
{
printf("密码输入错误,你还可以输入%d次!\n", n);
goto Again;
}
}
return 0;
}
以上述代码为例,我们就可以看出goto语句的简单粗暴,直接将程序的运行带入到指定的位置,运用起来十分的方便,但方便的背后也存在一个很大的隐患,就是goto语句容易使程序“乱飞”,造成逻辑上的混乱,在程序的书写和维护上都会造成比较大的困难,因此一般不建议使用。
六、奇怪的循环
本文的最后,给大家介绍一个奇怪的循环,程序执行后会死循环。在下一期的开头我们再来聊聊,这次保证不会再拖更了哦 O v O !
int main()
{
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int i = 0;
for (i = 0; i <= 10; i++)
{
arr[i] = 0;
}
return 0;
}