C语言分支和循环(1)

        这篇博客我将介绍C语言中的分支和循环。C语言是一种结构化的程序设计语言,而这里的结构指的就是顺序结构选择结构循环结构。我们可以使用 if,switch 实现分支结构,使用for while 和 do while实现循环结构。

if语句

if语句的表达式如下

if(表达式)
{
   语句
}

        表达式为真则语句执行,表达式为假则语句不执行。在C语言中0为假,非0为真,所以若表达式结果为0则语句不执行,表达式结果不为0则语句执行。

示例:输入一个整数判断是否为奇数

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

        与if相对应的则是else语句,如果一个数不是奇数那么就是偶数。此时我们可以用if...else...来判断这个整数是奇数还是偶数。

if(表达式)
{
    语句1
}
else
{
    语句2
}

        用这种语句我就可以实现一些基本功能

示例:C语言输入一个年龄,>=18就输出成年,反之输出未成年

#include<stdio.h>

int main()
{
    int age;
    printf("请输入年龄:");
    scanf("%d", &age);

    if(age >= 18)
    {
        printf("成年\n");
    }else
    {
        printf("未成年\n");
    }

    return 0;
}
 

需要我们注意的是if和else语句中默认都只控制一条语句,若需要控制多条语句则需要 {} 将代码括起来,上述代码已经向大家展示出来啦。既然是分支结构那我们能不能尝试嵌套if呢?结果是肯定的,闲话不用多说,直接上代码展示。

#include <stdio.h>

int main() 
{
    int num;

    printf("请输入一个整数:");
    scanf("%d", &num);

    if (num == 0)
    {
        printf("输入的整数是0\n");
    } else if (num > 0) 
    {
        printf("输入的整数是正数\n");
    } 
    else
    {
        printf("输入的整数是负数\n");
    }

    return 0;
}
 

        上述代码向我们证明了 else 可以与 if 连用,构成多重判断。有了嵌套if语句我们就可以完成更多复杂的逻辑判断啦

        我们还需要注意悬空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;
}

        很多初学者,上来以判断 a 是 0,不等于 1 ,那就执行 else 句,打印 haha 但是当你去运行代码,输出的结果是:啥都不输出。为什么呢? 这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近 的 if 匹配。 上面的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if 语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第⼆个 if 进⾏匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不 成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。

        如果代码改成下⾯这样就更加容易理解了

#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匹配,可以这样修改代码:

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

        这就是为什么我们要带大括号的原因,只要带上适当的大括号,代码的逻辑就会更加的清晰,所以大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。

关系操作符

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

> 大于运算符

< 小于运算符 

>= 大于等于运算符 

<= 小于等于运算符 

== 相等运算符 (要注意==与=的区别)

!= 不相等运算符

        关系表达式通常返回 0 或 1 ,表示真假。 C 语言中, 0 表示假,所有非零值表⽰真。比如, 20 > 12 返回 1 , 12 > 20 返回 0 。 关系表达式常用于 if 或 while 结构。

条件操作符

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

 exp1 ? exp2 : exp3

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

逻辑操作符

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

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

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

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

        在这里有一点需要我们注意:短路

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

        &&操作符左边操作数的结果是0的时候,右边操作数就不再执行。

        || 操作符的左操作数的结果不为0时,就⽆需执行右操作数。

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 后的值,必须是整形常量表达式。

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

switch语句中的break

        只有在 switch 语句中使用break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。 所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。 当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

switch语句中的default

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

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

        switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏ default ⼦句。

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

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

这篇博客我们就先介绍到这里,感谢大家的浏览,欢迎大家在评论区提出宝贵意见。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值