C语言——分支与循环

时间:2024-01-24 22:52:45

C语言中,分支语句与循环语句是我们接触的基础语句之一,可以说是大厦之基。本篇我们先来看分支语句。

分支语句包括if语句和swich语句两部分。我们先来看if语句,最简单的if语句如下

if(条件)
{
  语句1;
}
else
{
  语句2;
}

if后的圆括号里是判断条件,判断是否执行花括号里的语句;如果,判断条件为真,则执行if后的语句;判断条件为否,则执行esle里的语句。如果if后没有跟else,则什么也不执行。

注:花括号可以省略,但是,一旦省略花括号则if或else只于紧跟其后的下一条语句匹配,这样写代码容易出错,故不建议。另外,else与if的匹配遵从”就近原则“,即else与距离它最近的if匹配。例如下面这段代码

if(条件1)
{
   语句1;
}
		if(条件2)
      {
         语句2;
      }  
 else
 {
   语句3;
 }

这段代码中else是与第二个if匹配而不是第一个!

如果有多种情况,此时我们可以使用else if,例如下面这段代码,每个else if对应不同的判断条件:

if(条件1)
{
   语句1;
}
else if(条件2)
{
   语句2;
}  
else if(条件3)
{
   语句3;
}  
else if(条件n)
{
   语句n;
}  
 else
 {
   语句n+1;
 }

接下来是if语句的嵌套,是的,套娃来了。if语句可以嵌套使用,一个if或else的语句里可以包含另一个if语句,有点类似思维导图,一个树枝分出了多个树枝(嗯,面目逐渐狰狞起来)。例如以下代码:

if(条件1)
{
  if(条件2)
  {
  	语句1;
  }
  else if
  {
    语句2;
  }
}
else
{
  语句3;
}

       那么,关于if语句基本用法就说到这里。接下来我们来看另一种分支语句——switch语句,switch语句适合处理多分支情况的语句。在if语句里,如果遇到多分枝情况,我们说可以是用else if,但这只适用于分支不多的情况。想象一下,如果很多个分支,每一个分支我们都要打一遍else if外加一对花括号,且不说效率低下,反正我薄弱的心脏是无法接受这么麻烦的事。所以,switch语句就给我们提供了便捷的解决方法。我们来看:

switch(表达式)
{
  case 常量或常量表达式1:语句1;break;
  case 常量或常量表达式2:语句2;break;
  case 常量或常量表达式3:语句3;break;
  case 常量或常量表达式n:语句n;break;
  default 常量或常量表达式n+1:语句n+1;break;
 }

switch语句讲多分支整合到了一起,switch语句会先对圆括号里的表达式求值,求得的值对应花括号里哪一个分支则会进入该分支,执行其后的语句。一般来说,  每个分支后的break语句不能省略,因为一旦去掉break,那么程序会从进入的分支开始往下依次执行。default则是的是当常量表达式的值无法找到对应分支是会执行其后的语句。


switch(表达式)
{
  case 常量或常量表达式1:语句1;
  case 常量或常量表达式2:语句2;
  case 常量或常量表达式3:语句3;
  case 常量或常量表达式n:语句n;
  default 常量或常量表达式n+1:语句n+1;break;
 }

上面这段代码,假设从常量表达式1进入,由于没有break跳出,程序除了会执行语句1,还会依次执行语句2·3·4直到语句n+1。另外,switch语句内部不需要考虑顺序(default也可以在switch内部任意位置),但一般来说,为了便于阅读,会依次排序,并将default排在最后。

那么,如果当我们想让多个情况对应执行同一条语句该怎么办呢?难不成需要我们每一种情况都写一遍吗?当然不需要。在这种情况我们可以使用多重标签来解决。下面来让我们了解switch多重标签.请看下面一段代码:

switch(表达式)
{
  case 常量或常量表达式1:
  case 常量或常量表达式2:语句1;break;
  case 常量或常量表达式3:
  case 常量或常量表达式4:语句2;break;
  case 常量或常量表达式n-1: 
  case 常量或常量表达式n:语句n;break;
  default 常量或常量表达式n+1:语句n+1;break;
 }

以上代码中,假设从常量表达式1进入,则由于其后未关联语句,什么也不会执行,又由于没有break语句,会往下执行,进入常量表达式2。假设从表达式2进入,则会执行语句1,然后执行break跳出,后面的以此类推。这样,我们就完成了多个情况执行同一条语句,也就是多重标签。

最后,我们来思考一个点,那就是else if和switch我们该用哪一个,毕竟表面上他们的功能大体一致。当面对浮点类型的变量或表达式,我们就没法使用switch语句。另外,如果是根据范围判断执行的情况,使用switch语句将会异常麻烦。因为,我们需要范围内每一个整数都设置一个标签。