c语言提供了三种循环方式“while”“for”“do……while”
我们先来讲解一下while循环,while循环和if分支有一些相似之处
格式:
while(表达式)
语句;当我们表达式的返回值为“true”时候就进入循环体,若为“false”就不进入循环

#include <stdio.h>
int main()
{
while (1)
printf("hehe\n");
return 0;
}此时表达式为“1”,那表达式的返回值为”true“,就进入循环,循环进入一次后就会跳出循环,跳到循环开头,然后又进入表达式,又输出,这样会反复进入再输出,可以在电脑上试一下

那如果这样写
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
while (1)
printf("hehe\n");
printf("haha\n");
return 0;
}
也只会死循环打印”hehe“,不会打印"haha",这是因为while循环也只会匹配单个语句,弱项匹配多个语句就要用到大括号,
#include <stdio.h>
int main()
{
while (1)
{
printf("hehe\n");
printf("haha\n");
}
return 0;
}
那我们来做一道题以便理解记忆”打印1到10的数字“
你是不是要让代码执行到能够打印完数字的次数,所以表达式就要执行到比打印的次数多一次
#include <stdio.h>
int main()
{
int num1=1;
while (num1<=10)
{
printf("%d ",num1);
num1++;
}
return 0;
}
因为要打印1到10的数字就要让表达式的值从1变成10,当表达式的值为10的时候满条件就进入循环打印最后一个数字10,然后后置++并跳出循环又会跳回到循环开头,num1执行后置++后会变成11(后置++和前置++在我前面的分支与循环1中的单目运算符中讲到),再进入表达式,此时表达式返回值为”false“,不进入循环,循环结束,所以表达式才会比打印的次数多执行一次
for循环是c语言中使用循环频率相对较高的
格式:
for(表达式1;表达式2;表达式3;)
语句; //和while一样,若要多条语句就要加大括号表达式1:用于循环变量的初始化 表达式2:用于循环结束的条件判断 表达式3:用于循环变量的调整

#include <stdio.h>
int main()
{
int num1 = 1;
for (num1; num1 <= 10; ++num1) //1.num1 2.num1<=10 3.printf("%d ",num1); 4.++num1
printf("%d ",num1);
return 0;
}一行注释就代表for循环的执行顺序,

在这里”num1++“和”++num1“效果是一样的(可以在电脑上运行一下)
那这里也做一道题吧”打印1到100之间的3的倍数之和“
#include <stdio.h>
int main()
{
int sum=0;
for (int i = 0; i <= 100; i+=3)
{
sum = sum + i;
}
printf("%d",sum);
return 0;
}首先看for循环前面两个表达式,这两个表达式决定了值的范围为0到100,第三个表达式“i+=3”相当于“i=i+3”,这样就生成了以3的倍数的数字了,然后进入循环体相加,等加完之后执行打印输出总和
格式:
do
语句
while(表达式);看到格式的时候就表明这个循环它最少执行语句为一次,当执行到表达式的时候,为“true”就再上去继续循环,直到表达式返回值为“false”就停下来,while循环和for循环都是先判断表达式为“true”后再执行循环体语句,为“false”就停下来,而do……while循环则是先进入循环体执行语句后在进入表达式判断真假,所以do……while循环至少执行一次循环体语句

那再用do……while做一下打印出1到10的数字
#include <stdio.h>
int main()
{
int num1 = 1;
do
{
printf("%d ", num1);
num1++;
} while (num1<=10);
return 0;
}
break:执行到break时就跳出循环,不再执行任何循环体语句并执行循环下的其他语句
continue:跳过本次循环continue后的代码,在while和for中有所不同
#include <stdio.h>
int main()
{
int num1 = 1;
while (num1<=10)
{
if (num1 == 5)
{
break;
}
printf("%d ",num1);
num1++;
}
return 0;
}原本的代码若没有break就会执行打印1到10的数字,但是现在加了一个if条件分支,当num1的值等于5的时候就进入分支语句,break就跳出本次循环,5也不会打印出来,执行while循环后面的代码

那我们现在换成continue
#include <stdio.h>
int main()
{
int num1 = 1;
while (num1<=10)
{
if (num1 == 5)
{
continue;
}
printf("%d ",num1);
num1++;
}
return 0;
}此时可以看到打印出的数字,当num1的值为5的时候进入IF分支语句,执行continue后返回到循环开头,num1为5(因为num1++在if语句下面,就执行不了num1++了)小于等于表达式的10,所以进入循环后又遇到了if语句,再执行continue后回到循环开头,一直重复,虽然打印出了四个数字,但程序没有结束

那如果把num1++语句放在if语句之前会怎么样?
#include <stdio.h>
int main()
{
int num1 = 1;
while (num1<=10)
{
num1++;
if (num1 == 5)
{
continue;
}
printf("%d ",num1);
}
return 0;
}
因为我们先执行了num1++,所以num1就变成了2,再打印输出第一个循环就为“2”,所以当num1的值为4的时候执行num1++后变成5,再执行IF分支语句就返回循环开头,再进入循环后执行num1++变成6,就输出打印,当num1的值为10的时候就进入循环执行num1++变成11后打印输出,所以最后的答案没有5
#include <stdio.h>
int main()
{
int num1 = 1;
for (num1; num1 <= 10; ++num1)
{
if (num1 == 5)
{
break;
}
printf("%d ",num1);
}
return 0;
}num1的范围为1到10,当num1的值为5的时候小于等于10,进入循环再进入IF分支执行break跳出循环执行for循环后面的代码

再换成continue
#include <stdio.h>
int main()
{
int num1 = 1;
for (num1; num1 <= 10; ++num1)
{
if (num1 == 5)
{
continue;
}
printf("%d ", num1);
}
return 0;
}num1的范围为1到10,当num1的值为5的时候小于等于10,进入循环再进入IF分支执行continue后返回for循环的第三个表达式++num1之后num1的值变为6再次进入循环执行打印输出,所以最后答案没有输出5

我们把if分支放在打印输出的后面
#include <stdio.h>
int main()
{
int num1 = 1;
for (num1; num1 <= 10; ++num1)
{
printf("%d ", num1);
if (num1 == 5)
{
continue;
}
}
return 0;
}
当年num1的值为5的时候就先打印输出后再执行IF分支语句中的continue并返回for循环的第三个表达式++num1,所以num1从以前的5变成6在进入循环,直到num1的值为10之后打印输出,再执行++num1,不满足表达式就跳出循环
#include <stdio.h>
int main()
{
int num1 = 1;
do
{
printf("%d ", num1);
num1++;
if (num1 == 5)
{
break;
}
} while (num1 <= 10);
return 0;
}打印输出再if语句的前面,所以当num1为4的时候打印输出后执行num1++变成5就进入IF语句后跳出循环

#include <stdio.h>
int main()
{
int num1 = 1;
do
{
printf("%d ", num1);
num1++;
if (num1 == 5)
{
continue;
}
} while (num1 <= 10);
return 0;
}当num1为4的时候打印输出后执行num1++变成5就进入IF语句后返回循环开头输出打印5后再执行num1++变成6就不执行IF语句了,所以最后的答案都会打印(要根据if语句和后置++在不同的位置而定)

goto语句和跳转标号是c语言中最特别的语法,goto语句可以实现再同一个函数内跳转到设置好的标号处,但如果goto语句使用不当会导致再函数内部随意跳转,但也可实现再多层循环中快速跳出循环
#include <stdio.h>
int main()
{
again:
printf("hehe\n");
goto again;
return 0;
}代码中我让goto返回到again,而again在打印输出前面,所以会持续打印输出

#include <stdio.h>
int main()
{
printf("hehe\n");
goto again;
printf("haha\n");
again:
printf("enen\n");
return 0;
}如果没有goto语句的话原本打印输出hehe和haha,但现在使用了goto语句就会执行到该语句时跳到goto对应的语句,就会跳过haha的打印直接打印enen
