分支结构的小知识

在这里插入图片描述

一、关于If语句的小知识

1. 条件何为真,何为假?

在C语言中,条件表达式的真假取决于其结果是否为真值(true)或假值(false)。通常情况下,条件表达式的结果为真值时,表示条件为真;结果为假值时,表示条件为假。

具体来说,C语言中将条件表达式的结果为0视为假(false),非零值视为真(true)。这是由C语言的逻辑运算规则决定的。

下面举一个例子:

#include <stdio.h>

int main() {
    int x = 5;
    
    if (x == 0) {
        printf("x is equal to 0\n");
    } else {
        printf("x is not equal to 0\n");
    }
    
    return 0;
}

运行结果

x is not equal to 0

在这个例子中,变量x的值为5,所以条件表达式x == 0的结果为假(false)。因为5不等于0,所以条件表达式的结果为0,即假值。因此,程序将执行else语句块中的代码,并输出"x is not equal to 0"。

2. if语句执行流程?else语句可以写多个吗?

if语句的执行流程可概括如下:

(1)首先,计算if后的条件表达式的值。
(2)如果条件表达式的值为真(非零),则执行if语句块中的代码。
(3)如果条件表达式的值为假(0),则跳过if语句块,继续执行后续代码。
(4)如果存在else语句,则当if条件为假时执行else语句块中的代码。

需要注意的是,else语句只能与一个if语句对应,不能直接写多个else语句。这是因为else语句始终与最近的未匹配的if语句配对。如果需要实现多个条件分支,可以使用嵌套的if-else结构,或者使用switch语句。

举个例子:

#include <stdio.h>

int main() {
    int x = 10;

    if (x < 5) {
        printf("x is less than 5\n");
    } else if (x < 10) {
        printf("x is between 5 and 9\n");
    } else {
        printf("x is 10 or greater\n");
    }

    return 0;
}

运行结果

x is 10 or greater

在这个例子中,根据变量x的值,程序将会输出相应的消息,这里使用了一个if-else if-else结构来实现多个条件分支。

3. 分支包含多条语句可以不写花括号{}吗?

在C语言中,如果分支包含多条语句,可以选择是否使用花括号{}来包裹这些语句。不写花括号的话,只有紧接在if或else后的第一条语句会被条件控制。这种情况下,建议始终使用花括号,以提高代码的可读性和可维护性。

下面是一个例子:

if (x > 0)
    printf("x is positive\n");
    printf("This line is always executed\n");

当x > 0时,运行结果:

x is positive
This line is always executed

当x < 0时,运行结果:

This line is always executed

在这个例子中,第二条printf语句是在条件控制之外,无论x为何值,总是会被执行。如果希望它们都受条件控制,应该使用花括号包裹起来。

4. if的嵌套使用?

在C语言中,可以在if语句中嵌套使用其他的if语句,形成多层的条件判断。这种嵌套可以让程序根据不同的条件执行不同的代码块。例如:

if (x > 0) {
    if (y > 0) {
        printf("x and y are both positive\n");
    } else {
        printf("x is positive but y is not\n");
    }
} else {
    printf("x is not positive\n");
}

5. 悬空else问题——就近原则!

在C语言中,悬空else问题指的是else与最近的未匹配的if语句相匹配的情况。这意味着else语句可能会与不正确的if语句配对,导致程序逻辑出现错误。为了避免悬空else问题,应该使用花括号明确指定if和else的作用范围。

举个例子:

if (x > 0)
    if (y > 0)
        printf("Both x and y are positive\n");
else
    printf("x is not positive\n");

运行结果:

x = 1 y = 2
Both x and y are positive

x = 1 y = -1
x is not positive

x = -1 y = 2
x is not positive

显然,输出结果取决于x和y的值。
在这个例子中,else语句与最近的未匹配的if语句相匹配,即与if (y > 0)相匹配,而不是与if (x > 0)相匹配。这意味着无论x的值如何,else语句都会执行。这与代码的预期行为不符。

因此为达到预期效果,使用花括号明确指定if和else的作用范围,如下所示:

if (x > 0) {
    if (y > 0) {
        printf("Both x and y are positive\n");
    }
} else {
    printf("x is not positive\n");
}

运行结果:

x = 1
y = 2

Both x and y are positive

x = 1
y = -1

x is not positive

x = -1
y = 2

x is not positive

二、关于Switch语句的小知识

当我们在C语言中使用switch语句时,我们通常用它来替代一系列的if-else语句。

1. if-else如何改写为switch语句?

if-else语句可以通过switch语句来改写,前提是if-else的条件是可以被转换为整数或字符类型。例如:

// 使用if-else语句
if (x == 1) {
    printf("One\n");
} else if (x == 2) {
    printf("Two\n");
} else if (x == 3) {
    printf("Three\n");
} else {
    printf("Other\n");
}

上述代码可以改写为:

// 使用switch语句
switch (x) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
    case 3:
        printf("Three\n");
        break;
    default:
        printf("Other\n");
        break;
}

2. switch后的表达式类型是什么?

switch后的表达式可以是整数类型或字符类型,即任何可以用于判断的整数或字符。它可以是intcharshort等整数类型,或是字符类型。
注意,不能是浮点型 floatdouble

3. case后面值的类型是什么?(注意case和值之间一定要有空格)

case后面的值必须是常量表达式,可以是整数常量、字符常量或枚举常量。注意,case和值之间必须有空格。例如:

switch (x) {
    case 1:
        // do something
        break;
    case 'A':
        // do something else
        break;
    default:
        // default case
        break;
}

在这个例子中,case 1中的值是整数常量,case 'A'中的值是字符常量。

4. default?switch的运行顺序是什么?

default是可选的,用于处理switch表达式中没有任何一个case匹配的情况。当switch中的表达式的值与某个case的值匹配时,程序将会执行该case下的语句,然后跳出switch语句。如果没有一个case匹配成功,则会执行default语句(如果有的话),然后跳出switch语句。default并不是必须的,如果没有default,那么当没有匹配的case时,程序将直接跳出switch语句。

switch语句的运行顺序是从上至下逐个检查case是否匹配,直到找到匹配的case或者到达defaultswitch语句的结尾。

一个简单的例子:

switch (x) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
    default:
        printf("Other\n");
        break;
}
switch (x) {
 	default:
        printf("Other\n");
        break;
 	case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
    
}

假设x的值是2,两者运行结果都为:

Two

三、总结

1. if语句与switch语句的用法

  • if语句

    • 用于根据条件执行不同的代码块。
    • 能够处理单条件判断、多条件判断以及嵌套条件判断等情况。
    • 语法结构灵活,适用于各种条件判断场景。
  • switch语句

    • 用于根据表达式的值匹配不同的case值,执行对应的代码块。
    • 更适用于多个值匹配同一种处理逻辑的场景。
    • 代码结构清晰,易于理解和维护。

2. if语句与switch语句的语法结构

  • if语句

    if (条件表达式) {
        // 如果条件为真,执行这里的代码块
    } else {
        // 如果条件为假,执行这里的代码块
    }
    
  • switch语句

    switch (表达式) {
        case1:
            // 如果表达式的值等于值1,执行这里的代码块
            break;
        case2:
            // 如果表达式的值等于值2,执行这里的代码块
            break;
        // 更多的case语句
        default:
            // 如果表达式的值都不匹配上面的任何一个值,执行这里的代码块
            break;
    }
    

3. if语句与switch语句的使用场景

  • if语句

    • 适用于各种条件判断场景,包括单条件判断、多条件判断以及嵌套条件判断等。
    • 当条件较为复杂或灵活变化时,if语句更为灵活。
  • switch语句

    • 适用于多个值匹配同一种处理逻辑的场景,简化多条件判断的代码逻辑。
    • 当条件为表达式的值匹配不同case值时,使用switch更为直观。

因此

  • if语句和switch语句都是用于条件判断的控制流程语句,各自适用于不同的场景。
  • 在简单的条件判断场景下,if语句更加灵活;在多个值匹配同一种处理逻辑的场景下,switch语句更加简洁。
  • 根据具体情况选择合适的条件判断方式,以提高代码的可读性和可维护性。
  • 39
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值