C语言---分支和循环

正文

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-whileswitch语句中使用。
-  当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-whileswitch语句中使用。
-  当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语言---分支和循环】

通过深入理解分支与循环的概念和用法,我们能够更好地控制程序的流程和逻辑,实现更灵活、精确的代码。希望本篇博客对您有所帮助,如果有任何错误或建议,请随时与我交流。

最后,感谢您的阅读!

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值