EP3:分支和循环(c语言笔记)

序言:C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构.编程语言是对现实世界的模拟从而达到解决现实世界的问题的目的,所以,世间万物的发展皆遵循这三种结构.

1.if语句

1.1if

if语句的用法如下

if ( 表达式 )
 语句

表达式如果为真,则执行此语句,如果是假则不执行此语句.

在c语言中,0表示假,则此语句便会执行.非零则表示真,则此语句便不会执行.

例子:输入一个数字,判断是否为奇数

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

1.2 else

如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表示呢? 这⾥就需要 if-else- 语句了,语法如下.

if ( 表达式 )
 语句1
else

例子:输入一个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印数偶数。

#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 else 语句中, else 可以与另⼀个 if 语句连用,构成多重判断。

形成if--else if--else的形式

使用形式如下s

#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的嵌套使用.

示例:输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:负数。

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

1.4 悬空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;
}

2.关系操作符

C 语言用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称 为“关系运算符”(relational operator),主要有下面6个。

• > 大于运算符

• < 小于运算符

• >= ⼤于等于运算符

• <= 小于等于运算符

• == 相等运算符

• != 不相等运算符

注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。

另一个需要避免的错误是:多个关系运算符不宜连用。

如下不规范的示范

i < j < k

上面式子中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进行比较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使用下面的写法。

1 (i < j) < k

上面式子中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进行比较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使用下面的写法。

1 i < j && j < k

比如:我们输入一个年龄,如果年龄在18岁~36岁之间,我们输出青年。 如果我们这样写

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(18<=age<=36)
 {
 printf("⻘年\n");
 }
 return 0;
}

3. 条件操作符

条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:

1 exp1 ? exp2 : exp3

条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。

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

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下⾯三个运算符。 • ! :逻辑取反运算符(改变单个表达式的真假)。

• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。 • || :或运算符,就是或者的意思(两侧至少有⼀个表达式为真,则为真,否则为假)。 注:C语言中,非0表示真,0表示假

4.1 逻辑取反运算符

⽐如,我们有⼀个变量叫 flag ,如果flag为假,要做⼀个什么事情,就可以这样写代码:

#include <stdio.h>
int main()
{
      int flag = 0;
    if(!flag)
      {
    printf("do something\n");
       }
 return 0;
}

如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真 所以上⾯的代码的意思就是 flag 为假,执行if语句中的代码。

4.2 与运算符

&& 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是 a&&b , && 两边的表达 式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。

4.3 或运算符

|| 就是或运算符,也就是或者的意思,|| 也是⼀个双目操作符,使用的方式是 a || b , || 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

4.4 短路

C语言逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

5. switch语句

除了 if 语句外,C语言还提供了 switch 语句来实现分支结构.switch 语句是⼀种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重 的 else if 改成更易用、可读性更好的形式。

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

上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分行。如果找不到对应的值, 就执行default 分至. 注: • switch 后的 expression 必须是整型表达式 • case 后的值,必须是整形常量表达式

5.1 if语句和switch语句的对比

练习:输入任意⼀个整数值,计算除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;
}

上述的代码中,我们要注意的点有: 1. case 和后边的数字之间必须有空格 2. 每⼀个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。

5.2 switch语句中的break

前⾯的代码中,如果我们去掉case语句中的break,会出现什么情况

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

7

余数是1

余数是2

 我们发现,7除以3本来余数是1,但是我们发现程序运⾏的结果多了一行“余数是2”的打印。 这是为什么呢? 原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使用break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就比如上面的代码就执行了 case 2 中的语句。 所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。 当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

5.3 switch语句中的default

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

switch (expression)

   {

case value1:

     statement

case value2:

     statement default:

statement

    }

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

在 switch 语句中 case 子`句和 default 子句有要求顺序吗? default 只能放在最后吗?其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。 不过我们通常是把 default 子句放在最后处理的。

6. while循环

C语⾔提供了3种循环语句, while 就是其中⼀种,接下来就介绍一下 while 语句。 while 语句的语法结构和 if 语句非常相似。(个人觉得while就是将一个if在特定条件下进行循环)

6.1 if 和 while的对比

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

如下面两个例子进行更为具体的对比

//代码1
#include <stdio.h>
int main()
{
     if(1)
     printf("hehe\n"); //if后边条件满⾜,打印⼀次hehe
 return 0;
}
//代码2
#include <stdio.h>
int main()
{
 while(1)
 printf("hehe\n"); //while后边的条件满⾜,死循环的打印hehe
 return 0;
}

这就是他们的区别,while语句是可以实现循环效果的。(由此得出结论 while 语句就是循环版的 if 语句)

6.2 while语句的执行流程

初始化-->判定-->调整

6.3 while循环的实践

练习:在屏幕上打印1~10的值

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

 

7. for循环

for 循环是三种循环中使用最多的, for 循环的语法形式如下:

for(初始化; 判定式; 调整)

实践:在屏幕上打印1~10的值

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

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

9. break和continue语句

• break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。

• continue 的作用是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所 差异的。

 9.1 while循环中的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;
}

9.1.2 continue举例

continue 是继续的意思,在循环中的作用就是跳过本次循环中 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;

所以在 for 循环中 continue 的作用是跳过本次循环中 continue 后的代码,直接去到循环的调 整部分。未来当某个条件发⽣的时候,本次循环无需再执行后续某些操作的时候,就可以使uongcontinue 来实现。

 10. goto语句

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

#include <stdio.h>
int main()
{
    printf("hehe\n");
    goto next:
    printf("haha\n");
 
next:
    printf("跳过了haha的打印\n"); 
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值