分支和循环

   C语言上结构化的程序设计语言,分为顺序结构,选择结构,循环结构。该文章主要介绍的是选择结构和循环结构,以下为正文:

1.if语句

 1.1if

if语句的语法形式如下:

if ( 表达式 )
语句

表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏

在C语言中,0为假,非0表示真。

1.2 else

else表示除if中表达式之外的结果,语法形式如下:

if ( 表达式 )
     语句 1
else
     语句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 ;
}

1.3分支中包含多条语句 

if只能控制一条语句,如果想让if控制多条语句,可以使用{},如下所示:

      if(表达式)

     {

              语句1

              语句2

              语句3

     }

1.4嵌套if 

if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。
⽐如:要求输⼊⼀个整数,判断输⼊的整数是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 ;

上面红色部分就是嵌套在else中if语句。

不仅有以上的形式,还有如下的形式:

  if(表达式)

{     

      if(表达式)

          语句1

      else

          语句2

}

 

1.5悬空else问题 

如果有多个 if else ,可以记住这样⼀条规则, else 总是跟最接近的 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 ;
  }
这就是悬空 else 的问题,如果有多个 if else ,可以记住这样⼀条规则, else 总是跟最接近
if 匹配。
上⾯的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if
语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if
进⾏匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不
成⽴,嵌套 if else 就没机会执⾏了,最终啥都不打印。

2.关系操作符

C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称
为“关系运算符”(relational operator),主要有下⾯6个。
> ⼤于运算符
< ⼩于运算符
>= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符
!= 不相等运算符
注意 :多个关系运算符不宜连用
   i < j < k
上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。

 (i < j) < k

上⾯式⼦中, i < j 返回 0 1 ,所以最终是 0 1 与变量 k 进⾏⽐较。如果想要判断变量 j
的值是否在 i k 之间,应该使⽤下⾯的写法。
i < j && j < k

 

 3.条件操作符

条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果
exp1 为假, exp3 计算,计算的结果是整个表达式的结果。

4.逻辑操作符:&&,||,!

 逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。

 ! :逻辑取反运算符(改变单个表达式的真假)。

&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。

|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

5.switch语句

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。
switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重
else if 改成更易⽤、可读性更好的形式
以下为switch语句的表达形式:
switch (expression)
{
  case value1: statement
  case value2: statement
  default : statement
}
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,
就执⾏ default 分⽀。

注意

switch 后的 expression 必须是整型表达式
case 后的值,必须是整形常量表达式
case 和后边的数字之间必须有空格
每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。

5.1switch语句的default

在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹 配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。

switch (expression)
{
   case value1: statement
   case value2: statement
   default : statement
}
switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏
default ⼦句。

5.2switch语句中的case和default的顺序问题

在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗? 其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实 际需求的就可以。

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

6.while循环

C语⾔提供了3种循环语句, while 就是其中⼀种,接下来就介绍⼀下 while 语句。
while 语句的语法结构和 if 语句⾮常相似。

   6.1while的语法结构

 

while ( 表达式 )
    语句 ; // 如果循环体想包含更多的语句,可以加上⼤括号

while语句是可以实现循环效果的。 

  6.2while语句的执行流程

以下为while语句的执行流程图:

 6.3while循环的实践 

例子:在屏幕上打印1到10的值

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

7.for循环 

  7.1语法形式

    for 循环是三种循环中使⽤最多的, for 循环的语法形式如下:
for ( 表达式 1 ; 表达式 2 ; 表达式 3 )、
   语句; // 如果循环体想 包含更多的语句,可以加上⼤括号
表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整

 7.2 for循环的执行流程

先执行表达1:初始化,接着表达式2:判断,如果为假则结束,如果为真就执行语句,接着执行表达式3:调整。

整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环。

 7.3 for循环的实践

例子:在屏幕上打印1到10的值

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

7.4 while循环和for循环的对比 

for while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部
分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形式上 for 循环要更优⼀些。

8.do-while 循环

  8.1语法形式

  在循环语句中 do while 语句的使⽤最少,它的语法如下:
do
语句;
while ( 表达式 )
while for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳
出循环;
do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表
达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。

 8.2 do while循环的执行流程

do while 循环中先执⾏图上的“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的
结果是!=0,则继续循环,执⾏循环语句;判断表达式的结果==0,则循环结束。
所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅。

 8.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 ;
}

 ⼀般 do while 使⽤在循环体⾄少被执⾏⼀次的场景下,所以较少⼀些。

9.break和continue语句

在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中提供了 break continue 两个关键字,就是应该到循环中的。
break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执
⾏。
continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所
差异的。

  9.1while循环中的break和continue

    9.1.1 break举例

# include <stdio.h>
int main ()
{
 int i = 1 ;
while (i<= 10 )
{
 if (i == 5 )
 break ; // i 等于 5 后,就执⾏ break ,循环就终⽌了
 printf ( "%d " , i);
 i = i+ 1 ;
}
 return 0 ;
}

结果是只打印了1 2 3 4 

 9.1.2 continue举例

continue 是继续的意思,在循环中的作⽤就是跳过本次循环中 continue 后边的代码,继续进⾏
下⼀次循环的判断。
上⾯的代码,如果把 break 换成 continue
# include <stdio.h>
int main ()
{
   int i = 1 ;
   while (i<= 10 )
{
if (i == 5 )
   continue ;
// i 等于 5 后,就执⾏ continue ,直接跳过 continue 的代码,去循环的判断的地⽅
// 因为这⾥跳过了 i = i+1 ,所以 i ⼀直为 5 ,程序陷⼊和死循环
   printf ( "%d " , i);
   i = i+ 1 ;
}
return 0 ;
到这⾥我们就能分析出来, continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接
到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成 死循环。

 9.2 for循环中的break和continue

  break,continue的操作和作用和while中差不多

注意:for中的continue是跳过continue后的代码,然后来到for中的表达式3。

9.3 do while循环中的break和continue

do.while 语句中的 break continue 的作⽤和 while 循环中⼏乎⼀模⼀样,⼤家下来可以
⾃⾏测试并体会。

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 就⾮常的⽅便了。

 

      

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值