流程图
观察上图,不难看出,所有循环语句都是在执行完循环体后,先操作循环变量,后进行循环条件判断。
while循环
C
#include <stdio.h>
int main()
{
int ch = 0;
while((ch = getchar())!=EOF)
{
putchar(ch);
}
}getchar()详细解析参见[[C/读入]]
- 数组元素个数计算
C
int size = sizeof(arr)/sizeof(arr[0]);//获取右区间下标需要-2,排除下标+'\0'
int size = strlen(arr);//-1,排除下标一定要使用
sizeof(arr[0]),防止在32/64位平台上的计算错误
- 错误示例:
C
void function(int arr[]){
int size = sizeof(arr)/sizeof(arr[0]);//这里的arr[]传入的是数组的指针变量,值为4/8,size计算会出错
}for循环
C
for(初始化语句;终止条件判断;调整语句)- break:直接跳出本层循环
- continue:跳过本次循环并执行调整语句
- 不要随意在循环体中调整循环变量
C
for(i=0;i<100,i++)//循环100次
for(i=100,i<=200,i++)//循环100次
for(;;)//判断部分省略判断恒成立——死循环
for(int i = 0;i=0;i++)//循环0次,i=0为假do while循环
C
do
statement//循环语句
while(表达式);//在表达式为假或0之前重复执行循环体
使用场景^[三种循环结构for、while、do-while的应用场景_与while do while 相比,for更适合在哪里使用_立志Java工程师的博客-CSDN博客]
for循环:三个表达式会被依次执行到,执行顺序也是固定的,所以for循环适用于循环次数固定的场景 while循环:只有一个判断条件,结果位布尔值,如果为true就执行循环,为false就不执行。所以while循环适用于不知道循环次数,只知道循环达到某个条件可以执行时使用。在循环内,一般需要对循环变量进行改变,否则会发生死循环 do-while循环:与while循环类似,只是判断条件放到了循环最后,不管是否满足条件,循环都会被执行一次,因此,do-while循环适用于不知道循环具体执行次数,只知道满足某个条件继续执行或结束执行,并且循环肯定执行一次时的场景。
二分查找(Binary Search)
- 使用条件
- 数组有序
- 无重复元素
C
#include <stdio.h>
int search(int arr[], int size, int target)
{
int left = 0;
int right = size - 1;
int middle = 0;
while (left <= right)
{
middle = left + ((right - left) / 2);
if (arr[middle] < target)
{
left = middle + 1;
}
else if (arr[middle] > target)
{
right = middle - 1;
}
else
{
return middle;
}
}
return -1;
}
int main()
{
int a[] = {0, 1, 2, 3, 4, 5};
printf("%d\n", search(a, 6, 4)); // 5
printf("%d\n", search2(a, 6, 4)); //-1
return 0;
}参考资料:[[【二分查找】详细图解]]
goto语句
C
#include <stdio.h>
int main(){
again:
printf("111");
printf("222");
goto again;
}用于跳转到指定标记处
- 不能跨函数goto
- 常用于处理深度嵌套的处理过程
C
for()
for()
for()
if(...)
goto error;
---
error:
...switch
执行流程
如果不break掉就会接着执行接下来的case中的语句,无论case分支结果为真还是为假