首页 > 代码库 > C语言攻略指南(三)流程控制篇

C语言攻略指南(三)流程控制篇

流程控制语句,或者说控制流语句,是用于控制程序计算操作执行的次序,使我们能实现判断,选择,循环等操作。本篇将逐一描述 C语言中的流程控制语句。

选择结构

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

如果表达式的值为真(非0),执行语句1,如果为假(0),则执行语句2。(在 C语言中,非零即真)

这里的语句并不单指一条以 ; 为结束符的语句,也可能是多条语句,而是多条语句时,即代码块,最好用 { } 括起来,这样不容易出错,也方便读。

else 部分是可选的,如果不写,表达式的值为真执行语句1,为假不操作,执行后面的代码。

技术分享
#include <stdio.h>
 
int main ()
{
    int a, b;
    
    a = 1;
    b = 2;
    if( a > b )
        printf("a 的值大 \n");
    else
        printf("b 的值大 \n");
    
    return 0;
}
example

 

  • else-if 语句
if(表达式1)
  语句1;
else if(表达式2)
  语句2;
...
else
  语句n;

 这是编写多路判断的常用方法,如果条件1不成立,则判条件2,如果条件2不成立,则判条件3... 当全部条件都不成立(所有表达式的值都为0),则执行语句n。

通俗来说,就是哪个从上往下,哪个表达式的值先为真,就执行哪个表达式下对应的语句。

技术分享
#include <stdio.h>
 
int main ()
{
    int select;
    
    printf("请输1~3: ");
    scanf("%d" ,&select);
    if( select > 3 || select < 1 )
    {
        printf("输入错误!\n");
        return 0;
    }
    
    if( select == 1 )
        printf("大师兄,师傅被妖怪抓走啦! \n");
    else if( select == 2 )
        printf("大师兄,二师兄,师傅被妖怪抓走啦! \n");
    else
        printf("大师兄,师傅和二师兄被妖怪抓走啦!~\\(≧▽≦)/~ \n");
        
    return 0;
}
example

 

if 语句可以嵌套使用

if(表达式)
    if(表达式)
        if(表达式)
    ...
        else
    else
else

if 和 else 的匹配准则是: else 与距离它最近的在同一个作用域内的没有被配对的 if 进行匹配。

注意: 在使用 if 语句 要注意同级的(配对的)if 和 else 的起始位置要放在同一列,用 { } 将作用域划分清楚,不容易出错。 

 

 

  • switch 语句
switch(表达式){
    case 常量表达式1:
        语句1;
        [break;]
    case 常量表达式2:
        语句2;
        [break;]    
    ...
    case 常量表达式n:
        语句n;
        [break;]  
    default:
        语句n+1;
        [break;]          

[...] 代表可选

switch 语句的执行过程: 首先计算出表达式的值,如果某个case后面的常量表达式N(N取1-n)的值等于 switch 语句中表达式的值,那么就执行该case后的语句N;如果没有,执行 default后的语句n+1。

注意: 如果语句段后面有 break,则执行完语句N后退出 switch语句,否则将继续执行下去,直到遇见 break,如果没有 break,将执行到最后一条switch 语句。

技术分享
#include <stdio.h>
 
int main ()
{
    int score;
    
    printf("请输入学生的得分: ");
    scanf("%d" ,&score);
    if( score > 100 || score < 0 )
    {
        printf("输入错误!\n");
        return 0;
    }
    
    switch(score/10){
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("学生成绩为:差 \n");
            break;
        case 6:
            printf("学生成绩为:及格 \n");
            break;    
        case 7:
            printf("学生成绩为:中 \n");
            break;
        case 8:
            printf("学生成绩为:良 \n");
            break;
        default:
            printf("学生成绩为:优 \n");
    }
    
    return 0;
}
example

 

switch 语句也可以嵌套

技术分享
switch(表达式1){
    case 常量表达式1:
        switch(表达式2){
                case 常量表达式2-1:
                    语句1;
                    [break;]
                case 常量表达式2-2:
                    语句2;
                    [break;]    
                 ...
                case 常量表达式2-n:
                    语句n;
                    [break;]  
                default:
                    语句n+1;
                    [break;] 
    }    
        [break;]
    case 常量表达式2:
        语句2;
        [break;]    
    ...
    case 常量表达式n:
        语句n;
        [break;]  
    default:
        语句n+1;
        [break;]
}                               
switch嵌套一般形式

注意: 在使用 switch 嵌套时,break 仅仅是终止当前的 switch 语句,而不是退出整个多重 switch 语句。

 

 

循环结构

  • while 循环
while(表达式)
{
    循环体;
}

 

首先求表达式的值,如果其值为真(非0),则执行循环体,并再次求表达式的值,按照这种模式循环下去,直到求得表达式的值为假(0)为止,之后将跳出循环,执行while循环之后的语句。

example: 逐行打印 0-9 十个数(while)

技术分享
#include <stdio.h>
 
int main ()
{
   int a = 0;

   while( a < 10 )
   {
      printf("a 的值: %d\n", a);
      a++;
   }
 
   return 0;
}
View Code

 

 

  • do-while 循环
do{
  语句;
}while(表达式);

  

do-while 是先执行循环体,再判断表达式的值是否为真,如果为真,继续执行循环体,否则退出循环。

do-while循环与while循环的区别: 由于do-while 是先执行再判断,故无论do-while 的表达式是什么,其循环体至少会执行一次,而while循环是至少0次。

注意: 在 while(表达式)后有一个分号,不能被省略,否则会报错。

example: 逐行打印 0-9 十个数(do-while)

技术分享
#include <stdio.h>
 
int main ()
{
   int a = 0;

   do{
      printf("a 的值: %d\n", a);
      a++;
   }while( a < 10 );
 
   return 0;
}
View Code

 

 

  • for 循环
for( 表达式1; 表达式2; 表达式3 )
  语句;

  

表达式1 和 表达式3 是赋值表达式或函数调用,表达式2 是关系表达式。这三个表达式均可省略,但必须保留分号。如果省略表达式2 (测试条件),则认为其值永远是真值;省略表达式1 和表达式3,它就相当于while循环语句。

 example: 逐行打印 0-9 十个数(for)

技术分享
#include <stdio.h>
 
int main ()
{
    for( int a = 0; a < 10; a++ )
       printf("a 的值: %d\n", a);
    
    return 0;
}
标准版
技术分享
#include <stdio.h>
 
int main ()
{
    int a = 0;
    
    for( ; a < 10; )
    {
       printf("a 的值: %d\n", a);
       a++;
    }
    
    return 0;
}
省略版

 

break 语句与 continue语句

break 语句的作用是退出循环结构,在嵌套的 for 语句或者嵌套的 switch 语句退出的是 break 所在的循环结构。

技术分享
#include <stdio.h>
 
int main ()
{
    int i;
    int a[]={2,-1,4,7,-3,8};
    
    for( i = 0; i < 6; i++ )
        if( a[i] < 0 )
            break;
        else
            printf("%d \n", a[i]);
    
    return 0;
}
View Code

 

continue 语句是结束本次循环,而非真正退出循环结构。

技术分享
#include <stdio.h>
 
int main ()
{
    int i;
    int a[]={2,-1,4,7,-3,8};
    
    for( i = 0; i < 6; i++ )
        if( a[i] < 0 )
            continue;
        else
            printf("%d \n", a[i]);
    
    return 0;
}
example

 

 

goto 语句

goto 语句也叫无条件转移语句。注意: goto 语句只能在函数内部进行迁移,不能够跨越函数。

goto    语句标号;
...
语句标号:

或

语句标号:
...
goto    语句标号;

语句标号是 goto 语句转向的目标,语句标号遵循 C语言命名规则,且后有冒号而不是分号。

技术分享
#include <stdio.h>
 
int main ()
{
    int num;
    int sum;
    num = 0;
    sum = 0;
    
loop:
    sum += num;
    num++;
    if(num<10)
        goto loop;
    printf("sum = %d \n",sum);

    return 0;
}
example

实际中尽可能少用 goto 语句,如用了,需写清楚注释。

 

ps: O(∩_∩)O~~

C语言攻略指南(三)流程控制篇