上回说到,分支和循环语句的分支语句,那么今天我们来补完循环语句,虽然两部分分布时间离得有点远,但是……(流汗)。
循环语句说白就是一直不停做某事,虽然重复,但每次都有不同的变化,为了满足需要,C语言诞生了三种循环语句,分别是for,while,do...while。接下来,请允许我向你们依次介绍。
while循环的表达式
while(表达式)
语句
类似if语句的表达式
if(表达式)
语句
运行逻辑
表达式用于判断是否执行,若表达式为真,则循环一次,如此反复。
表达式的说明
while的表达式其实是满足循环的条件,这个表达式为合法的任意类型的表达式,我认为,这个表达式常用到
1.双目运算符(甚至复合)如:while(a > b),while(a > 0 && b < 100)
2.单个变量(就是利用变量是否为真)如:while(a),一般结合a--;
3.死循环(1),一般结合break;
4.函数返回值 while(Add( )) ,Add() 是一个函数调用表达式,其返回值被用作循环条件。
5.赋值表达式 while ((c = getchar()) != '\n') 表示每次循环都会从输入中读取一个字符并赋值给 c ,然后检查它是否不等于换行符。
细节
加上大括号,才能包含二个及以上的语句
for循环的表达式
for(表达式1,表达式2,表达式3)
语句
表达式1:循环变量的初始化
表达式2:循环结束条件的判断
表达式3:循环变量的调整
运行逻辑
第一次循环,从表达式1到2到3。
第二至n次,从2至3,也就是表达1初始化部分只执行一次
细节
加上大括号,才能包含二个及以上的语句
表达1初始化部分只执行一次
while循环与for循环的对比
while和for都有初始化,判断,调整
while的初始化,和调整去哪了,初始化在while之前,调整在大括号**
int i = 0;
while(i < 10)
{
i++
}
总的来说,for循环相对集中,更易修改
do...while的表达式
do
语句
while(表达式);
不同于for和while循环语句,它至少执行一次
运行逻辑
先执行一次,再判断表达式是否为真,真就继续循环,假就不循环
细节
表达式后的逗号易忽略
加上大括号,才能包含二个及以上的语句
break和continue语句在for,while,do...while循环中的运用
首先,我认为这里break可以翻译为终止,continue可以翻译为继续,首先,我们看一下二者在while循环语句的作用**
#include<stdio.h>
int main()
{
int i = 0;
while (i < 4)
{
printf("%d", i);
break;
i++;
}
return 0;
}
结果是0
若无break,结果是0 1 2 3
#include<stdio.h>
int main()
{
int i = 0;
while (i < 4)
{
printf("%d", i);
continue;
i++;
}
return 0;
}
结果是死循环0
可见,break是终止一个循环语句,countinue是在循环体(大括号及大括号里的内容)内跳过后面的代码
接下来,是for循环语句了
#include<stdio.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
if (i == 5)
{
break;
}
printf("%d ", i);
}
return 0;
}
结果是0 1 2 3 4
#include<stdio.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
}
return 0;
}
结果是0 1 2 3 4 6 7 8 9
这里,不得不提continue在whlie和for两种循环语句一些区别了,一般而言,使用continue后,前者会跳过i(即自变量)调整部分,后者往往不会
接下来是do…while循环语句
作用几乎一模一样
#include<stdio.h>
int main()
{
int i = 0;
do
{
printf("%d ", i);
i++;
if (i == 5)
{
break;
}
} while (i < 10);
return 0;
}
结果是0 1 2 3 4
#include<stdio.h>
int main()
{
int i = 0;
do
{
printf("%d ", i);
i++;
if (i == 5)
{
continue;
}
} while (i < 10);
return 0;
}
结果是0 1 2 3 4 5 6 7 8 9 因为continue的后面无其他语句了,所以打印了5
接下来,便是重头戏
三种循环的嵌套
for,while,do...while均存在嵌套,就是每一种循环即在它本身的大括号里再用它自己,也可以用另一种循环(注意是一种)
#include <stdio.h>
int main() {
// 外层循环控制行
for (int i = 0; i < 3; i++) {
// 中层循环控制列
for (int j = 0; j < 3; j++) {
// 内层循环控制特定的操作
int k = 0;
while (k < 3) {
printf("i: %d, j: %d, k: %d\n", i, j, k);
k++;
}
}
}
return 0;
}
break是永久的终止循环,但每次只能跳出一个循环语句,三层嵌套则需要三次break才能完全跳出
goto语句
goto用于一个函数内部的跳转(不可以从一个函数跳到另一个,只能在一个函数内部跳)
这个函数可以是主函数(即main),也可以是库函数,自定义函数
#include <stdio.h>
int main()
{
int i;
outer_loop: // 标签
for (i = 0; i < 5; i++)
{
if (i == 3)
{
goto outer_loop; // 跳转到 outer_loop 标签
}
printf("%d ", i);
}
return 0;
}
#include <stdio.h>
void process_data(int* data)
{
if (data == NULL)
{
goto error; // 如果数据指针为空,跳转到 error 标签
}
// 处理数据...
printf("Processing data...\n");
return;
error:
printf("Error: Null pointer provided.\n");
}
#include <stdio.h>
void custom_function()
{
int condition = 1;
start:
if (condition)
{
printf("Condition is true.\n");
condition = 0; // 改变条件,以便下次循环时不打印
goto start; // 跳转回 start 标签
}
}
int main()
{
custom_function();
return 0;
}
接下来,就是用这三种循环语句实现一个小游戏(猜数字游戏)
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void game( )
{
int count = 5;
int r = rand() % 100 + 1;
int n = 0;
while(count)
{
printf("还剩%d次机会\n",count);
printf("请猜数字>:");
scanf("%d", &n);
if (n > r)
{
printf("猜大了\n");
}
else if (n < r)
{
printf("猜小了\n");
}
else if (n == r)
{
printf("猜对了\n");
break;
}
count--;
if (count == 0)
{
printf("失败了,正确答案是%d\n",r);
break;
}
}
}
void menu()
{
printf("***************\n");
printf("*****1.play****\n");
printf("*****0.exit****\n");
printf("***************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束");
break;
default:
printf("请重新输入");
break;
}
} while (input);
return 0;
}
好吧,其实只用了while,do...while两种循环语句
注意:rand函数是生成伪随机数的,srand函数是使rand函数真正生成的是随机数,srand函数我们只需调用一次就行,先记住吧,毕竟这不是重点。rand函数使用,要用到头文件《stdlib.h》,由于srand函数里使用了time函数,要用到头文件《time.h》。
补充说明一下:
生成0~99的随机数
rand()%100
生成0~100的随机数
rand()%100+1
生成100~200的随机数
100+rand()%100+1
生成a~b的随机数(a>=100)
a+rand()%(b-a)+1
希望我的内容可以对你产生帮助,加油哦,宝子们
这里对上一期的内容进行纠正,很抱歉,对大家产生了一定的误解

这里不应该出现for的,不好意思

这里补充一下
if (month >= 3 && month =< 5)
{
printf("Spring");
}
当输入month = 2时,既然左操作数(month >= 3)为假,右操作数(month <= 5)也不用去判断month = 2
if (month == 12 || month == 1 || month == 2)
{
printf("Winter");
}
当输入month = 12时,既然左操作数(month == 12)为真,右操作数(month == 1 || month == 2)(这里左,右操作数相对于第一个||)month不用去判断month = 2

或者(表达式两侧至少有一个为真则假,没有表式为真则假)纠正为
或者(表达式两侧至少有一个为真则真,没有表式为真则假)
另外,补充说明一下
左,右操作数
if (month == 12 || month == 1 || month == 2)
{
printf("Winter");
}
1. 第一个比较运算: month == 12
左操作数: month 右操作数: 12
2. 第二个比较运算: month == 1
左操作数:month 右操作数: 1
3. 第三个比较运算: month == 2
左操作数: month 右操作数: 2
对于第一个||
左操作数: month == 12
右操作数: month == 1 || month == 2
总之,在编程语言中,左操作数和右操作数是相对于二元运算符而言的
1253

被折叠的 条评论
为什么被折叠?



