学习笔记 | C语言中的分支语句

123 阅读4分钟

概述

C 语言是结构化的程序设计语言

C 语言支持 3 种结构:

  • 顺序结构

  • 选择结构

    • if
    • switch
  • 循环结构

    • while
    • for
    • do while

今天的主要学习内容为选择结构,也叫做分支语句

if

if 语句的语法形式:

if (表达式)
    语句

输入一个值,判断是否为奇数

int main()
{
    int num = 0;
    scanf("%d", &num);
    if (num % 2 == 1)
        printf("%d 是奇数\n", num);
    return 0;
}

执行结果

image-20231101002027430

输入年龄,判断能否谈恋爱(18岁可以谈)?

int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age >= 18)
        printf("成年了\n");
        printf("可以谈恋爱了\n");
    else
        printf("未成年\n");
        printf("不可以谈恋爱\n");
​
    return 0;
}

程序执行报错

image-20231101002354280

这是因为if和else只能控制一条语句。如果包含多条语句,需要把代码放在{ }中。

int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age >= 18)
    {
        printf("成年了\n");
        printf("可以谈恋爱了\n");
    }  
    else
    {
        printf("未成年\n");
        printf("不可以谈恋爱\n");
    }
        
    return 0;
}

执行结果

image-20231101002627857

image-20231101002643993

{ }括起来之后的叫代码块,程序块或者复合语句。

要求输入一个整数,判断输入的整数是0,还是正数或者负数。

int main()
{
    int num = 0;
    scanf("%d", &num);
    if (num == 0)
        printf("输入的数字是0\n");
    else if(num >= 0)
        printf("输入的数字是正数\n");
    else
        printf("输入的数字是负数\n");
​
    return 0;
}

执行结果

image-20231101003132256

请输入一个整数,如果是正数,在判断是奇数还是偶数,并输出;如果不是证书则输出不是正数。

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

执行结果

image-20231101003908713

悬空 else 问题

int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

执行结果

image-20231101092716068

这里体现了代码编写规范的重要性。

关系操作符

操作符解释
<小于运算符
>=大于等于运算符
<=小于等于运算符
==相等运算符
!=不相等运算符

关系表中返回 01,表示真假。

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

注意:=为赋值符号,并不能作为判断。

多个关系操作符,不宜连用

int main()
{
    int i = 8;
    int j = 10;
    int k = 9;
    if (i < j < k)
        printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

执行结果

image-20231101114520409

判断顺序:

  • ij比较,发现小于,为真,此时返回True,也就是1
  • 继续将1k比较,结果为小于,所以会打印“hehe”。

所以,在实际项目中,不建议使用这一类写法。

正确写法

int main()
{
    int i = 8;
    int j = 10;
    int k = 9;
    if (i < j && j < k)
        printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

执行结果

image-20231101115929315

同理,10 <= num <= 30 这一类写法也比较坑,同样存在上述问题。

这里用到了逻辑操作符&&,下面继续学习。

逻辑操作符

逻辑操作符解释
!逻辑取反运算符
&&与运算符,两侧表达式都为真,则为真,否则为假
``或运算符,两侧至少有一个表达式为真,则为真,否则为假

逻辑取反运算符

int main()
{
    int flag = 0;
    if(!flag)
        printf("hehe\n");
    return 0;
}

执行结果

image-20231101234018686

逻辑与运算符,两边都是真,即为真。

int main()
{
    int month = 0;
    scanf("%d",&month);
    //3~5约是春季
    if(month >= 3 && month <= 5)
        printf("春季");
    return 0;
}

执行结果

image-20231101234300360

或运算符,两边只要有一个真,即为真。

int main()
{
    int month = 0;
    scanf("%d",&month);
    //1212月份是冬季
    if(month == 12 || month == 1 || month == 2)
        printf("冬季");
    return 0;
}

执行结果

image-20231101234708850

短路

C 语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,所以左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况为短路

if(month >=3 && month <= 5)

Switch

switch语句是一种特殊形式的if...else结构,用于判断条件有多个结果的情况。

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

注意:

  • switch后的expression必须是整形表达式
  • case后的值,必须是整形常量表达式;那么字符类型可不可以?答:可以,因为字符类型存储的是ASCII码,ASCII也是整形。
  • default可以放在任意位置。

输入任意一个整数值,计算除3之后的余数。

int main()
{
    int num = 0;
    scanf("%d", &num);
    switch (num % 3)
    {
    case 0:
            printf("余数是 0");
    case 1:
            printf("余数是 1");
    case 2:
            printf("余数是 2");
    }
    return 0;
}

执行结果

image-20231102225041489

发现执行结果与预期不符,这是因为switch语句会一直往下执行,并不会因为满足条件而退出;此时需要break语句协助

int main()
{
    int num = 0;
    scanf("%d", &num);
    switch (num % 3)
    {
    case 0:
            printf("余数是 0");
            break;
    case 1:
            printf("余数是 1");
            break;
    case 2:
            printf("余数是 2");
            break;
    }
    return 0;
}

执行结果

image-20231102225153794

case 后面需要有个空格,并且结尾是冒号,而不是分号。