04--控制流

本文详细介绍了编程中的基本控制流语句,如if-else、switch、while、do-while和for循环,以及break、continue和goto的使用,强调了条件判断、多路分支和循环结构的关键概念和语法要点。
摘要由CSDN通过智能技术生成

1.二路分支

  • 逻辑:程序中某段代码需要在满足某个条件时才能运行
  • 语法:
    if语句:
    if (布尔型表达式)   // 如果  布尔型表达式 的结果位真则执行以下代码,否则不执行代码块
    {
        // 代码块
    }

  • 型式:
    1. if 语句:表达一种 如果-则 的条件执行关系
    2. if-else 语句:表达一种 如果-否则 的互斥分支关系
      if-else语句:
      if (布尔型表达式) // 如果  布尔型表达式 的结果位真则执行以下代码1, 否则则执行代码块2 
      {
          // 代码块1
          
      }
      else 
      {
           // 代码块2
          
      }
      - 注意:
      a.if 语句可以单独使用,else 语句不可以,else 语句必须跟if语句配套使用  
      ‘else’ without a previous ‘if’
      .不管是 if 语句还是 else 语句,代码块都必须使用大括号 { } 括起来,
      否则只有首句有效 (因此从可读性上不太建议这么使用)

2.使用二路分支if-esle 实现多路分支:

if (表达式1) // 如果 表达式1 的结果位真则执行以下代码1, 然后退出 ,否则判断表达式2 
{
    // 代码块1
    
}
else if (表达式2 ) // 如果 表达式2 的结果位真则执行以下代码2, 否则判断表达式 3
{
     // 代码块2
    
}
else if (表达式3 )// 如果 表达式3 的结果位真则执行以下代码3, 否则判断表达式 n
{
     // 代码块3
    
}
........
else  // 如果以上的所有表达式都不为真 ,则执行代码块 N 
{
     // 代码块N
}

3.多路分支

- 逻辑:根据不同的条件执行不同的代码片段
- 概念: switch 会对 整型表达式 进行匹配判断 是否等于 case 中的某一个 整型常量   如果匹配则执行该case 中的代码块,否则会一直比较下去直到遇到default。 
- 语法:
switch  ( 整型表达式 )
{
    case 整型常量1 :
        // 代码块1
        break ;  // 用于跳出switch case 语句

    case 整型常量2 :
        // 代码块2
        break ;

    ........
    
    case 整型常量N :
        // 代码块N
        break ;
    
    default :    
        // 代码块M
        break ;   
    
}

example: 

int main(int argc, char const *argv[])
{
    int Num = 0 ;
    int RetVal = scanf("%d" , &Num);
    if (RetVal != 1 )
    {
        fprintf( stderr , "scanf error ...\n");
        printf("scanf error ...\n");
        return -1 ; // 直接结束程序退出....
    }
    
    switch ( Num )
    {
        case 1:
            printf("用户输入的是 1 ..\n");
            
        
        case 2:
            printf("用户输入的是 2 ..\n");
            

        case 3:
            printf("用户输入的是 3 ..\n");
            break ;

        case 4:
            printf("用户输入的是 4 ..\n");
            break ;

        default :
            printf("用户输入的并不是预想中的值 ..\n");
            break ;
    }

    return 0;
}

- 要点解析:
a.switch(n) 语句中的 n 必须是一个整型表达式,即 switch 判断的数据必须是整型
b.case 语句只能使用整型常量,包括普通整型(1,2,3,4)或字符('a' , 'v' ,'n'),不包括 const 型变量。
c.break 语句的作用是跳出整个 swtich 结构,没有 break 程序会略过下一个case往下执行,直到遇到break 或整个switch-case语句结束
d.default 语句不是必须的,一般放在最后面(因此不需要 break)

4.while与 do…while循环

  • 逻辑:使得程序中某一段代码可以重复循环地运行
  • 形式:
    • while 循环:先判断,再循环
    • do-while 循环:先循环,再判断

语法:

while( 布尔表达式1 )  // 只要表达式 1 条件是满足的则会执行代码块中的内容 
{  // 代码块 开始 
    
    if( 布尔表达式2 )  // 表达式2 满足的话则会执行 以下代码块 
    {
        break; // 跳出当前while 循环体    
    }
    
// 代码块结束
}
注意:
只是用while循环语句的时候,只要while( 表达式 ) 中的表达式时成立的
那么循环将一直重复地运行下去,直到遇到以下情况:
- 在While 循环体中执行 return ,则会直接退出当前的函数
- 在 While 循环体中执行 break , 则会跳出当前的循环体
- 在While 循环体中执行 goto语句, 则会跳到指定的代码行进行执

5.break 的作用,是用于跳出当前循环结构

while(1)
{
    while(2)
    {
        
          break ; // 直接跳出当前的 while 2
    }
    
    for( ......)
    {
        if(...)
        {
            break ;   // 直接跳出当前的for       
        }    
    }
        
    break ; // 直接跳出当前的 while 1
    
}

6.do-while的语法:

do
{
    
    // 代码块   , 在任何的情况下 该代码块至少会被执行一次
    
}while( 布尔表达式 ) ;  // 当执行了一次代码块后进入 判断表达式进行判断

- 语法点:
- while 循环先进行判断,条件为真后才执行循环体,因此循环体可能一遍也不执行。
- do-while 循环先执行循环体,再进行判断,因此循环体至少会执行一遍。
- do-while 循环中的 while 语句后面有分号;

7.for循环

  • 逻辑:与 while 循环类似,但更加紧凑,for 循环将控制循环的变量集中在一行
  • 语法:
    for ( 表达式1  ;  表达式2  ;  表达式3  )
    {
        // 需要循环执行的代码块    
    }

    语法点:

    • 循环头的标准语法是: for(表达式1 ; 表达式2 ; 表达式3)
    • 表达式1一般用来初始化循环控制变量,可以是多个也可以是单个甚至没有,如果是多个的话需要使用逗号进行分割
    • 表达式2一般用来作为循环判定条件,为真则进入循环,为假则跳出循环。 判断条件可以使用 && || 逻辑运算符把多个表达式合成一个
    • 表达式3一般用来更新循环控制变量
    • 三个表达式均可以省略,但分号不能省略 。 则表示一个死循环类似于 while(1)
  • 示例:
    // 循环输出一系列整数,直到100为止
    int a;
    for(a=30; a<=100; a++)
    {
        printf("%d\n", a);
    }

    注意:

    在默认非使用C99 编译规则的编译器下编译程序有可能出现:如何解决:可以在 编译命令后面 加上选项 -std=c99 or -std=gnu99 即可

    gcc 06\ for.c  -std=c99    
    gcc 06\ for.c  -std=gnu99

8.break与continue

  • 逻辑:
    • break:① 跳出 switch 语句; ② 跳出当层循环体
    • continue:结束当次循环,进入下次循环
  • 举例:
    switch(n)
    {
        case 1:
            printf("one\n");
            break;  // 跳出 switch 语句
        case 2:
            printf("two\n");
            break;        
    }
    
    while(1)
    {
        int n = scanf("%d", &a);
        if(n == 0)
            break; // 跳出当层 while 循环体
    }
    
    for(int i=1; i<=100; i++)
    {
        if(i%7 == 0)
            continue; // 跳过所有能被7整除的数
         
        printf("%d\n", i);       
    }

    8.goto语句

  • 逻辑:无条件跳转
  • 语法:
    goto  标签名;
    
    标签名:
    example:
    int main()
    {
        printf("%d\n", __LINE__); // 打印第3行 
        
        // 无条件跳转到label处 
        goto label;
        printf("%d\n", __LINE__); // 打印第7行,此处被略过
    label:  
        printf("%d\n", __LINE__); // 打印第9行
    }

  • 语法:
    • goto语句直接跳转到本代码块中的标签处
    • 标签指的是以冒号结尾的标识符
  • 作用:
    • goto语句的无条件跳转不利于程序的可读性,一般在应用层不建议使用,主要出现在驱动的源代码中(底层的代码)
    • goto语句常被用在程序的严重错误处理中(硬件的初始化操作)
    • 总结当程序出现了严重的错误,则可以使用goto 到程序的默认进行还原(释放空间...)并退出的操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值