C语言的循环语句:
goto //严格意义上并不是循环语句 --- 跳转语句
while
do-while
for
构成循环的要素:
1.循环体 //反复被执行的代码
2.结束条件
3.使循环趋于结束的操作(或语句)
4.循环的初始条件
goto
C语言中的goto
语句允许程序控制跳转到同一函数内的任何位置,通过标签(label)标识跳转目标。其基本语法形式如下:
goto label;
// ...
label:
statement;
其中,label
是一个标识符,后接一个冒号(:
),紧跟着的语句即为跳转目标。
goto
语句允许将程序的控制流程从当前位置无条件地转移到同一函数内的另一个位置。这种无条件跳转可以在某些情况下提高程序的可读性和效率,特别是在处理错误情况时。
虽然大多数情况下使用for
、while
和do-while
等循环结构更为直观和安全,但在某些特殊情况下,使用goto
语句也可以实现复杂的控制流程,例如在多层循环中直接跳出所有循环。
注意事项和潜在问题:
- 滥用会导致程序难以理解:过度使用
goto
语句会导致程序控制流难以跟踪和理解,使得代码变得难以维护和调试。 - 潜在的错误来源:不当使用
goto
可能会导致代码中出现难以预测的错误,例如未初始化的变量或者跳过必要的清理代码。 - 优化替代方案:现代编程语言通常提供更安全和结构化的替代方案,如异常处理、函数调用、状态模式等,可以避免使用
goto
的需求。
总之,虽然goto
语句在某些情况下可以提供方便和灵活性,但在实际编程中应当慎重使用,确保其使用不会导致代码结构的混乱和可维护性的下降。
eg:
while语句
在C语言中,while
语句是一种用于实现循环控制流的结构。它允许程序重复执行某段代码,直到指定的条件不再满足为止。
语法:
while (表达式)
{
语句
}
语义:
判断 表达式 ,
真
执行 语句
语句 执行玩之后,继续表达式 判断,
重复上面的操作,
直到 表达式为假
假
while 结束,程序继续往下
while
语句的基本语法如下:
while (condition) {
// 循环体语句
}
主要组成部分:
-
条件 (
condition
):- 在
while
后的圆括号内指定一个条件表达式。只要条件表达式的值为真(非零),循环体内的语句将被重复执行。如果条件表达式的值为假(0),则循环终止,控制流将跳转到while
语句后的下一条语句。
- 在
-
循环体:
- 循环体是包含在花括号
{}
中的一组语句。这些语句会反复执行,直到条件表达式变为假为止。循环体可以包含任意数量的语句,甚至可以是空语句。
- 循环体是包含在花括号
下面是一个简单的例子,演示了while
语句的使用:
#include <stdio.h>
int main() {
int count = 1;
while (count <= 5) {
printf("Count: %d\n", count);
count++;
}
printf("End of program.\n");
return 0;
}
在这个示例中,count
变量从1开始,while
循环会重复执行,直到count
的值大于5为止。每次循环,会打印当前的count
值,然后count
自增。当count
达到6时,条件count <= 5
不再满足,循环终止,程序继续执行后续的语句。
特点和注意事项:
-
入口条件循环:
while
语句是入口条件循环,即在循环开始前先检查条件是否满足,如果条件不满足则一次也不执行循环体。 -
循环条件必须更新:为了避免无限循环,循环体内通常需要修改控制循环的条件变量,确保在适当的时候终止循环。
-
适用性广泛:
while
语句适用于需要重复执行、但执行次数不确定的情况,例如处理输入直到特定条件出现、对数据结构进行遍历等。 -
while()后面没有分号。
do-while语句
在C语言中,do-while
语句是一种循环结构,与while
循环类似,但它的循环体至少会执行一次,然后在检查条件之前重复执行。
语法:
do
{
语句;
}while (表达式);
语义:
先,执行 语句
然后 判断 表达式
真
继续 执行语句,然后判断,重复这个过程,直到 表达式为假,do-while 语句结束
假
do-while 结束,程序继续往下
do-while
语句的基本语法如下:
do {
// 循环体语句
} while (condition);
主要组成部分:
-
循环体:
- 循环体是包含在花括号
{}
中的一组语句,它们会被至少执行一次,然后根据条件来决定是否继续重复执行。
- 循环体是包含在花括号
-
条件 (
condition
):while
关键字后跟着一个条件表达式,条件表达式的值决定了是否继续执行循环体。如果条件表达式为真(非零),则继续执行循环体;如果条件表达式为假(0),则循环终止,控制流跳转到do-while
语句后的下一条语句。
示例:
下面是一个简单的例子,演示了do-while
语句的使用:
#include <stdio.h>
int main() {
int count = 1;
do {
printf("Count: %d\n", count);
count++;
} while (count <= 5);
printf("End of program.\n");
return 0;
}
在这个示例中,count
变量从1开始,do-while
循环会首先执行循环体,然后检查条件count <= 5
。只要条件为真,循环会继续重复执行。因此,即使在第一次循环时count
为1,循环体也会被执行一次。
特点和注意事项:
-
出口条件循环:
do-while
语句是出口条件循环,即在执行循环体之后才检查条件。因此,循环体至少会被执行一次。 -
适用性:
do-while
循环适合于那些需要至少执行一次的情况,然后根据条件决定是否继续执行的场景。 -
循环条件更新:与
while
循环类似,循环体内通常需要修改控制循环的条件变量,确保在适当的时候终止循环。 -
while后面的分号一定不要忘
while,do-while对比
do-while循环至少会执行一次
逻辑顺序不同:
while ---先判断,后执行
do-while ---先执行,后判断
for循环
for
语句是一种常用的循环结构,通常用于需要执行已知次数的循环操作。它允许在一个语句中结合初始化、条件判断和循环后的增量(或减量)操作。
语法:
for (表达式1;表达式2;表达式3)
{
循环体语句;
}
语义:
s1 求解 表达式1,
s2 判断 表达式2,
s3 真, 则 执行 循环体语句
执行完之后,
s4 求解 表达式3
求解完之后,继续判断表达式2
重复 s2 到 s4
直到 s2 判断为假,for循环结束
for
语句的基本语法如下
for (initialization; condition; increment/decrement) {
// 循环体语句
}
主要组成部分:
-
初始化 (
initialization
):- 在
for
关键字后的圆括号内,初始化表达式被执行一次。通常用于初始化循环变量,设置初始值。
- 在
-
条件 (
condition
):- 在每次迭代开始时,条件表达式被计算。如果条件表达式的值为真(非零),则执行循环体;如果为假(0),则跳出循环,执行循环后的语句。
-
增量/减量 (
increment/decrement
):- 在每次循环体执行结束后,增量表达式被执行。通常用于更新循环变量的值,使循环向前推进。
-
循环体:
- 循环体是包含在花括号
{}
中的一组语句,这些语句在每次迭代时都会被执行。
- 循环体是包含在花括号
示例:
下面是一个简单的例子,演示了for
语句的使用:
#include <stdio.h>
int main() {
for (int i = 1; i <= 5; i++) {
printf("Count: %d\n", i);
}
printf("End of program.\n");
return 0;
}
在这个示例中,for
循环首先初始化循环变量i
为1,然后在每次迭代开始时检查条件i <= 5
。只要条件为真,循环体会被执行,并且在每次循环结束后,i
会自增。当i
的值达到6时,条件不再满足,循环终止,程序继续执行后续的语句。
特点和注意事项:
-
灵活性:
for
循环适用于那些循环次数已知的情况,其语法结构简洁明了,可以在一行内完成初始化、条件判断和增量操作。 -
适用范围广泛:常用于需要迭代数组、列表或其他数据结构的情况下,以及需要执行特定次数的任务。
-
循环变量的作用域:循环变量(如示例中的
i
)的作用域仅限于for
循环内部,这意味着在循环外部不能直接访问或修改这些变量。 -
for 循环的三个表达式都可以省略,但是对应的循环要素不能省
表达式2 省略 ---表示循环条件永远为真
总之,for
语句是C语言中最常见和强大的循环结构之一,通常用于控制循环次数已知的情况下。
三种循环结构的选用
for //多用于 有一定范围
while
do-while //多用于 只有某个结束条件的
break
break
语句用于立即终止循环(for
, while
, do-while
)或switch
语句的执行,并跳转到紧接着该循环或switch
语句的下一条语句。
break 可以用在 switch
循环 while , do-while ,for
作用:
用在循环中 ,表示跳出 本层循环
continue
continue 语句
只用在循环中
作用:
结束本次循环,继续下一次循环
#include<stdio.h>
int main(void)
{
int i= 0;
int j = 0;
for(i = 0;i < 5;i++)
{
printf("i = %d\n",i);
for(j = 0;j < 5;j++)
{
printf("j = %d\n",j);
if(j>2)
break;
}
if(i%2==0)
continue;
printf("i = %d j = %d\n",i,j);
}
return 0;
}
执行结果为
数组:
概念
//一组数据
一组相同类型的数据的集合
一组相同类型的变量的集合
数组也是一种数据类型
应用场景:
批量的处理多个数据
语法:
类型说明符 数组名[常量表达式]
(1) (2) (3)
说明:
(1)类型说明符 --- 数据类型
整型 int/short/long/long long
浮点型 float / double /long double
字符型 char
作用: 用来说明 该数组中元素的类型
(2)数组名 --- 名字 (标识符)
用来代表这个数组
起名字规则 与 之前变量名起名规则一致
(3)[常量表达式]
--- [] //这个就是数组类型
常量表达式 //数组长度 --代表数组中元素的个数
注:
1. c99标准之后,数组长度 可以是变量
可变长数组
但是,不能初始化
int n;
scanf("%d",&n);
int a[n];
2. 数组长度,可以省略,但是必须要有初始化
编译器要根据初始化的值,来推算实际的长度
int len = sizeof(a)/sizeof(int); //计算实际长度
eg:
int array[10];
//表示此时定义了一个数组
//这个数组中存放的是int型的数据
//存放了10个int型的数据
//表示定义了一个可以存放10个int型数据的数组
//理解的角度,相当于一下子定义出10个int型变量
数组给值:
1.初始化
int a[10] = {}; //{} 初始化器
//全部初始化
int a[10] = {1,2,3,4,5,6,7,8,9,10};
//部分初始化 ---未初始化的部分会被初始化为0
int a[10] = {1,2,3,4,5};
//不初始化 --- 数组中是随机值(垃圾值)
int a[10];
2.赋值
循环赋值
输入的方式
int a[5];
int i = 0;
for(i = 0;i < 5;++i)
{
scanf("%d",&a[i]);
}
数组特点:
连续性 --- 数组空间是一片连续内存空间
有序性 --- 数组的元素挨个存放
单一性 --- 数组元素类型是同一类型
数组元素的引用:
语法:
数组名[下标]; //[] 此时表示的是一种运算 --- 数组下标运算
下标含义:
a[0] //下标表示的是相对于 数组名 偏移了几个元素
偏移量
a[1]
a[2]
...
a[9]
数组越界
//编译器不会检查,程序员自己小心
注意:
int a[10];
a 所代表的值 数组所占空间的首地址
a 所代表的数据类型 a 代表整个数组类型
a所代表的类型是int[10] ,这就是所谓的 数组类型
int a; //判断标识符所代表的数据类型 ---去掉标识符,剩下就是标识符对应的数据类型
int a[10];