C语言分支和循环结构

大家好,我将借助此篇文章与大家浅谈一C语言分支和循环结构。

C语言是结构化的程序数据语言。

ta分为顺序结构,选择结构和循环结构三种结构类型。

分支与循环分别属于选择结构与循环结构。

选择结构

1.if语句

1.1 if

if语句的格式为

if(表达式)
    语句

表达式为真则执行该if语句,否则不执行。

PS:非0都为真,只有0为假。

例1:输入一个整数,判断是否为奇数

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num % 2 == 1)
 printf("%d 是奇数\n", num);
 return 0;
}

1.2 if...else语句

若一个数不是奇数,那就是偶数了,想要判断一个数是奇数还是偶数,那么就需要用到if...else语句。

if...else语句的格式为

if(表达式)
    语句1
else
    语句2

    例2:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印数偶数。

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num % 2 == 1) 
    printf("%d 是奇数\n", num);
 else
    printf("%d 是偶数\n", num);
 return 0;
}

注意:if和else语句都只能控制一条语句!!!要想包含多条语句,务必用大括号括起来。

1.3嵌套if语句的使用

在if...else语句中,else可以和另一个if语句连用,构成多重判断。

例3:要求输入一个整数,判断输入的整数是0,还是正数或者负数。代码如下:

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num == 0)
 printf("输⼊的数字是0\n");
 else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
 printf("输⼊的数字是正数\n");
 else
 printf("输⼊的数字是负数\n");
 return 0;
}

嵌套if语句的使用可以使函数更加精简,帮助完成更复杂的判断。

1.4悬空else

“就近配对”原则:else总是和最接近的if配对。

为了更好理解这一原则,我们来看以下代码:

例4:

#include <stdio.h>
int main()
{
   int a = 0;
   int b = 2;
   if(a == 1)
       if(b == 2)
           printf("hehe\n");
   else
           printf("haha\n");
   return 0;
}

我们来运行一下,欸发现出问题了

它不输出结果。

这是为什么?这就与else和if的配对原则有关了:else和离它最近的if进行配对了。

上面的代码排版让我们误以为else和第一个if进行配对,但实际上它是与离它最近的if也就是第二个if进行配对,这样子的代码会影响我们的代码的理解。为了解决问题,我们需要加上大括号,避免出现配对错误的问题。我们来将程序进行修改:

#include <stdio.h>
int main()
{
 int a = 0;
 int b = 2;
 if(a == 1)
   {
     if(b == 2)
         printf("hehe\n");
     else
         printf("haha\n");
   }
    return 0;
}
#include <stdio.h>
int main()
{
   int a = 0;
   int b = 2;
   if(a == 1)
   {
       if(b == 2)
           printf("hehe\n");
   }
   else
   {
       printf("haha\n");
   }
   return 0;
}

适当加入大括号可以让我们对代码的理解更加清晰。

2.switch的使用

2.1 switch语句

除了if语句外,C语言还提供了switch语句来实现分支结构。

switch语句是一种特殊形式的if... else结构,用于判断条件有多个结果的情况。形式如下:

switch(expression)
{
     case value1:statement1
     case value2;statement2
     default:statement3
}

根据表达式expression不同的值,执行对应的case,如果找不到对应的case,则执行default分支。

PS:1.switch后的expression必须为整形表达式。

        2.case后的值,必须为整形常量表达式。

2.2 switch语句中的break

例5:输⼊任意⼀个整数值,计算除3之后的余数
如果使⽤if语句完成,如下:

#include <stdio.h>
int main()
{
   int n = 0;
   scanf("%d", &n);
   if(n%3 == 0)
      printf("整除,余数为0\n");
   else if(n%3 == 1)
      printf("余数是1\n");
   else
      printf("余数是2\n");
   return 0;
}

如果用switch语句编写,可以写成这样:

#include <stdio.h>
int main()
{
  int n = 0;
  scanf("%d", &n);
  switch(n%3)
  {
  case 0:
    printf("整除,余数为0\n"); 
    break;
  case 1:
    printf("余数是1\n"); 
    break;
  case 2:
    printf("余数是2\n"); 
    break;
  }
    return 0;
}

我们可以发现我们在用switch语句进行编写的时候用到了break,break起到了什么作用呢?

我们将break删掉试试,看看输出结果是什么。

欸我们发现7除以3的余数本该是1,但是在结果中却多打印了一条”余数是2“的语句。

这是为什么呢?

原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语
句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执⾏其他 case
语句中的代码,直到遇到 break 语句或者 switch 语句结束。就⽐如上⾯的代码就执⾏了 case 
2 中的语句。
因此,可得知在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

2.3 switch语句中的default

在switch语句中可能会遇到switch语句中的表达式与case语句没有能对应的,这时我们需要default子句来提示用户输入错误。

switch (expression) 
{
    case value1: statement
    case value2: statement
    default: statement
}

2.4 case与default的顺序问题

在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。

我们通常是把 default ⼦句放在最后处理的。

循环结构

3.while语句

3.1 while的语法形式

while语句的使用格式如下:

while(表达式)
     语句;

3.2 while的执行流程          

while语句的执行过程如下:

while语句具有实现循环的功能

3.3 while的实践

打印1~10的值

#include <stdio.h>
int main()
{
   int i = 1;
   while(i<=10)
   {
       printf("%d ", i);
       i = i+1;
   }
   return 0;
}

4.for循环

4.1 for循环的语法形式

for循环的表达式如下

for(表达式1;表达式2;表达式3)
{
     语句;
}

表达式1:循环变量的初始化

表达式2:循环条件结束的判断

表达式3:循环变量的调整

4.2 for循环的执行流程

流程图如下:

⾸先执⾏ 表达式1 初始化循环变量,接下来就是执⾏ 表达式2 的判断部分, 表达式2 的结果如果
==0,则循环结束; 表达式2 的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表达式3,调整循环变量,然后再去 表达式2 的地⽅执⾏判断, 表达式2 的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环。

4.3 for循环的实践

练习:打印1~10的值

#include<stdio.h>
int main()
{
     int i;
     for(i=1;i<=10;i++)
     {
         printf("%d ",i); 
     }
     return 0;
}

5.do...while  循环

5.1 do...while的语法形式

do...while语句使用较少,它的语法形式如下:

do
     语句;
while(表达式);

5.2 do...while的执行流程

如图所示:

5.3 do ...while的实践

练习:打印1~10的值

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        printf("%d ", i);
        i = i + 1;
    }while(i<=10);
    return 0;
}

6.goto语句

C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数
内跳转到设置好的标号处。

例6

#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 语句就会更加的快捷。

结束语

这是我的第一篇正式的博客,如果有任何错误,也希望您能指出。

  • 51
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值