正文
C语言是结构化的程序设计语言,这⾥的结构指的是顺序结构、选择结构、循环结构,C语言是能够实 现这三种结构的, 我们可以使用 if 、 switch 实现分支结构,使用 for 、 while 、 do while 实现循环结构。
下面是C语言中常用的分支和循环语句:
1. 分支语句(if语句)
if (条件) {
// 条件为真时执行的代码
}
else {
// 条件为假时执行的代码
}
其中,条件可以是任意的表达式,如果条件为真,则执行if语句块中的代码,否则执行else语句块中的代码。
2. 多重分支语句(if-else if-else语句)
if (条件1) {
// 条件1为真时执行的代码
} else if (条件2) {
// 条件2为真时执行的代码
} else {
// 以上条件均为假时执行的代码
}
如果条件1为真,则执行对应的代码块;如果条件1为假且条件2为真,则执行条件2对应的代码块;如果所有条件都为假,则执行else语句块中的代码。
注:如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
3. 选择语句(switch语句)
switch (表达式) {
case 值1:
// 当表达式的值等于值1时执行的代码
break;
case 值2:
// 当表达式的值等于值2时执行的代码
break;
...
default:
// 当表达式的值与以上所有值都不相等时执行的代码
break;
}
根据表达式的值选择执行相应的代码块。如果某个case的值与表达式的值相等,则执行该case对应的代码块;如果表达式的值与所有case的值都不相等,则执行default语句块中的代码。
4. 循环语句
- while语句
while (条件) {
// 循环体代码
}
只要条件为真,就会一直执行循环体中的代码。
- do-while语句
do {
// 循环体代码
} while (条件);
先执行一次循环体中的代码,然后再判断条件是否为真,如果为真则继续执行循环体,否则退出循环。
- for语句
for (初始化; 条件; 更新) {
// 循环体代码
}
初始化一次,然后判断条件是否为真,如果为真则执行循环体,并在每次执行完循环体后更新变量的值,再判断条件是否为真,直到条件为假才退出循环。
5. 关系操作符
关系操作符用于比较两个表达式的值,并返回一个布尔值(0表示假,非零表示真)。以下是C语言中的关系操作符:
- 相等:==,判断两个操作数是否相等。
- 不相等:!=,判断两个操作数是否不相等。
- 大于:>,判断左操作数是否大于右操作数。
- 小于:<,判断左操作数是否小于右操作数。
- 大于等于:>=,判断左操作数是否大于等于右操作数。
- 小于等于:<=,判断左操作数是否小于等于右操作数。
关系操作符通常用于条件语句中,用于判断给定条件是否为真,进而执行不同的代码块。
6. 逻辑操作符
逻辑操作符用于组合多个条件表达式,并返回一个布尔值。以下是C语言中的逻辑操作符:
- 逻辑与:&&,当且仅当两个操作数都为真时,返回真;否则返回假。
- 逻辑或:||,当且仅当两个操作数至少有一个为真时,返回真;否则返回假。
- 逻辑非:!,用于取反操作数的逻辑值,如果操作数为真,则返回假;如果操作数为假,则返回真。
逻辑操作符通常用于条件语句中,用于组合多个条件,从而得到复杂的逻辑判断。
当使用逻辑与(&&)和逻辑或(||)运算符进行逻辑运算时,C语言中存在一种称为短路(Short Circuit)的特性。
- 短路
-- 短路与
当使用逻辑与运算符(&&)进行逻辑运算时,如果第一个操作数为假(0),则不再计算第二个操作数,整个表达式的结果为假。因为只要有一个操作数是假,无论第二个操作数是什么,整个表达式都一定是假。
例如:
int a = 5, b = 0;
if (b != 0 && a/b > 2) {
// 当b不等于0并且a除以b的结果大于2时执行这里的代码
}
在上述代码中,当检查`b != 0`为假时,由于短路与的特性,不会继续计算`a/b > 2`的结果,整个条件判断为假,不会进入if语句内部。
-- 短路或
当使用逻辑或运算符(||)进行逻辑运算时,如果第一个操作数为真(非零),则不再计算第二个操作数,整个表达式的结果为真。因为只要有一个操作数是真,无论第二个操作数是什么,整个表达式都一定是真。
例如:
int a = 5, b = 0;
if (b == 0 || a/b > 2) {
// 当b等于0或者a除以b的结果大于2时执行这里的代码
}
在上述代码中,当检查`b == 0`为真时,由于短路或的特性,不会继续计算`a/b > 2`的结果,整个条件判断为真,进入if语句内部。
短路特性可以提高程序的效率,避免不必要的计算。但需要注意,使用短路特性时要注意操作数的顺序,确保其结果不会产生意外的错误或副作用。
7. 条件操作符
条件操作符也被称为三元运算符,它是C语言中唯一的一个三元操作符
使用形式为:
表达式1 ? 表达式2 : 表达式3
条件操作符根据某个条件的真假选择返回两个可能的值中的一个。
操作过程如下:
- 如果条件表达式为真,则整个表达式的值为表达式2的值。
- 如果条件表达式为假,则整个表达式的值为表达式3的值。
条件操作符可以用于简洁地表示条件分支,避免使用繁琐的if-else语句。例如:
int x = (a > b) ? a : b;
上述代码表示如果a大于b,则将a的值赋给x;否则将b的值赋给x。
8.break和continue语句
在编程中,break和continue是两个非常有用的语句,它们在控制循环结构和流程控制方面起着重要作用。尽管它们都用于跳出循环,但它们的用法和行为有所不同。
-break语句
- break语句用于立即跳出当前循环。
- 它可以在for、while、do-while和switch语句中使用。
- 当break语句遇到时,它会立即终止当前循环,不再执行循环内的剩余语句,然后继续执行循环之后的代码。
- 使用break跳出循环时,如果循环内有其他嵌套循环,只会跳出当前一层循环,不会跳出所有嵌套循环。
例子:
#include <stdio.h>
int main()
{
int i;
for (i = 1; i <= 10; i++)
{
if (i == 6)
{
break;
}
printf("%d ", i);
}
printf("\n");
return 0;
}
输出:1 2 3 4 5
在上面的例子中,我们使用了一个for循环来打印数字1到10,当i等于6时,执行了break语句跳出循环。因此,在输出时只打印了数字1到5。
-continue语句
- continue语句用于跳过当前循环的剩余部分,并立即开始下一次循环。
- 它可以在for、while、do-while和switch语句中使用。
- 当continue语句遇到时,它会跳过当前循环的剩余语句,然后立即开始下一次循环。
- 使用continue跳出循环时,如果循环内有其他嵌套循环,会跳过当前一层循环的所有剩余部分,包括其他嵌套循环的执行。
例子:
#include <stdio.h>
int main()
{
int i;
for (i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}
printf("%d ", i);
}
printf("\n");
return 0;
}
输出:1 3 5 7 9
在上面的例子中,我们使用了一个for循环来打印数字1到10中的奇数。当i是偶数时,执行了continue语句,跳过了余下的循环代码,直接开始下一次循环。因此,在输出时只打印了奇数。
总结一下,break语句用于彻底跳出当前循环,而continue语句用于跳过当前循环的剩余部分并继续下一次循环。在实际编程中,可以根据需要和场景选择使用break或continue语句,以实现更灵活的控制流程。
9.循环的嵌套
前面学习了三种循环 while , do while , for ,这三种循环往往会嵌套在⼀起才能更好的解决 问题,就是我们所说的:循环嵌套,这里我们就看⼀个例子。
例子:
找出100~200之间的素数,并打印在屏幕上。
注:素数⼜称质数,只能被1和本⾝整除的数字。
#include <stdio.h>
int main()
{
int i = 0;
//循环产⽣100~200的数字
for(i=100; i<=200; i++)
{
//判断i是否为素数
//循环产⽣2~i-1之间的数字
int j = 0;
int flag = 1;//假设i是素数
for(j=2; j<i; j++)
{
if(i % j == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
printf("%d ", i);
}
return 0;
}
解析:
1.要从100~200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。
2. 假设要判断i是否为素数,需要拿2~i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤ 循环解决。
3. 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。
10.goto语句
C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数 内跳转到设置好的标号处。
例如:
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next:
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用;但是 goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出使用 goto 就非常的方便了。
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//...
本来 for 循环想提前退出得使用 break ,一个 break 只能跳出一层 for 循环,如果3层循环嵌套 就得使用3个 break 才能跳出循环,所以在这种情况下我们使用 goto 语句就会更加的快捷。
11.生成随机数
在C语言中,生成随机数可以使用`rand()`函数或者`<stdlib.h>`库中的`srand()`函数。以下是一个简单的示例:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
// 使用当前时间作为随机数种子,确保每次运行程序时生成的随机数不同
srand((unsigned)time(NULL));
// 生成0到99之间的随机整数
int random_number = rand() % 100;
printf("生成的随机数为:%d\n", random_number);
return 0;
}
在这个示例中,我们首先包含了`<stdlib.h>`和`<time.h>`头文件,以便使用`srand()`和`time()`函数。然后,我们使用`time()`函数获取当前时间,并将其转换为随机数种子。接着,使用`srand()`函数设置随机数种子。最后,我们使用`rand()`函数生成一个0到99之间的随机整数,并将其打印出来。
如果你想在程序启动时生成一个固定不变的随机数,可以将随机数种子设置为一个固定的值,例如:```c
#include <stdio.h>
#include <stdlib.h>
int main()
{
// 设置一个固定的随机数种子,确保每次运行程序时生成的随机数相同
srand(12345);
// 生成一个0到99之间的随机整数
int random_number = rand() % 100;
printf("生成的随机数为:%d\n", random_number);
return 0;
}
在这个示例中,我们将随机数种子设置为12345,这样每次运行程序时,生成的随机数都将相同。
-设置随机数的范围
如果我们要生成0~99之间的随机数,方法如下:
rand() %100;//余数的范围是0~99
如果要生成1~100之间的随机数,方法如下:
rand()%100+1;//%100的余数是0~99,0~99的数字+1,范围是1~100
如果要生成100~200的随机数,方法如下:
100 + rand()%(200-100+1) //余数的范围是0~100,加100后就是100~200
所以如果要生成a~b的随机数,方法如下:
a + rand()%(b-a+1)
12.结语
以上就是我为各位带来的【C语言---分支和循环】
通过深入理解分支与循环的概念和用法,我们能够更好地控制程序的流程和逻辑,实现更灵活、精确的代码。希望本篇博客对您有所帮助,如果有任何错误或建议,请随时与我交流。
最后,感谢您的阅读!