Skip to content

流程图

1300 观察上图,不难看出,所有循环语句都是在执行完循环体后,先操作循环变量,后进行循环条件判断

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之前重复执行循环体

300

使用场景^[三种循环结构for、while、do-while的应用场景_与while do while 相比,for更适合在哪里使用_立志Java工程师的博客-CSDN博客]

for循环:三个表达式会被依次执行到,执行顺序也是固定的,所以for循环适用于循环次数固定的场景 while循环:只有一个判断条件,结果位布尔值,如果为true就执行循环,为false就不执行。所以while循环适用于不知道循环次数,只知道循环达到某个条件可以执行时使用。在循环内,一般需要对循环变量进行改变,否则会发生死循环 do-while循环:与while循环类似,只是判断条件放到了循环最后,不管是否满足条件,循环都会被执行一次,因此,do-while循环适用于不知道循环具体执行次数,只知道满足某个条件继续执行或结束执行,并且循环肯定执行一次时的场景。


  • 使用条件
  1. 数组有序
  2. 无重复元素
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

执行流程 600 如果不break掉就会接着执行接下来的case中的语句,无论case分支结果为真还是为假