写点什么

一文带你掌握 C 语言的分支结构

  • 2023-12-01
    福建
  • 本文字数:3680 字

    阅读完需:约 12 分钟

C 语言分支结构详解


1. if 语句


在本篇博客文章中,我们将深入探讨 C 语言中的 if 语句及其相关用法。if 语句是一种用于条件判断的分支语句,它允许我们根据条件的真假来执行不同的代码块。


1.1 if 语句的基本语法和用法


if 语句的基本语法如下所示:


if (条件) {    // 条件为真时执行的代码块}
复制代码


在这个语法结构中,条件是一个布尔表达式,如果条件的值为真(非零),则执行 if 语句块中的代码。


1.2 else 语句和 else if 语句的使用


除了 if 语句,我们还可以使用 else 语句和 else if 语句来处理条件的不同情况。else 语句在 if 条件以及 else if 条件(假设存在)均为假时执行,而 else if 语句用于在多个条件之间进行判断。


if 与 else if 均需条件,从 if 往下遍历条件,若所有条件不符合,执行 else 后的代码。


int num = 10;
if (num > 0) { printf("数字是正数\n");} else if (num < 0) { printf("数字是负数\n");} else { printf("数字是 0\n");}
复制代码


在这个示例中,我们根据 num 的值输出不同的结果。如果 num 大于 0,我们打印"数字是正数";如果 num 小于 0,我们打印"数字是负数";如果 num 等于 0(不大于 0 且不小于 0,就是 0),因此我们打印"数字是 0"。


1.3 if 语句的嵌套和多重条件判断


在 C 语言中,我们可以嵌套 if 语句,这意味着在一个 if 语句块内部包含另一个 if 语句块。这样可以实现更复杂的条件判断逻辑。


int num = 10;
if (num > 0) { if (num % 2 == 0) { printf("数字是正偶数\n"); } else { printf("数字是正奇数\n"); }} else if (num < 0) { printf("数字是负数\n");} else { printf("数字是 0\n");}
复制代码


在这个示例中,我们首先判断 num 是否大于 0,如果是,则进一步判断 num 是否为偶数或奇数。根据条件的不同,我们输出相应的结果。


1.4 悬空 else 问题及其解决方法


在 C 语言中,else 语句总是与最近的 if 语句配对,这就导致了一个被称为"悬空 else"的问题。当我们有多个嵌套的 if 语句时,可能会出现 else 语句与我们预期的 if 语句不匹配的情况。


为了解决悬空 else 问题,可以使用花括号(代码块)来明确 if 语句的范围,从而避免 else 语句与错误的 if 语句配对。


首先请看这个示例,初学者可能发现预期的输出和实际的输出有出入。


int num = -10;
if (num > 0) if (num % 2 == 0) printf("数字是正偶数\n");else printf("数字是负数\n");
复制代码


在这个示例中,初学者会下意识的根据缩进格式来判断,理所当然的认为上述代码打印"数字是负数",实际情况是什么都不会打印!!!因为 else 语句总是与最近的 if 语句配对


我们使用了花括号将 if 语句的范围明确标记出来,从而避免了悬空 else 问题。


int num = -10;
if (num > 0) { if (num % 2 == 0) { printf("数字是正偶数\n"); }} else { printf("数字是负数\n");}
复制代码


2. 关系操作符


在本节中,我们将介绍 C 语言中常用的关系操作符。在 C 语言中,任何非零值都被视为真(true),而零值被视为假(false)。关系运算符的结果大致上可以认为返回的是 bool 类型的 true 或者 false,但是,严格来说是int类型的1(表示真)或0(表示假)。


2.1 关系操作符的种类和用法


C 语言中的关系操作符包括以下几种:


  • ==:等于


  • !=:不等于


  • >:大于


  • <:小于


  • >=:大于等于


  • <=:小于等于


我们可以使用这些操作符在条件判断中比较两个值的大小关系。


2.2 关系操作符的返回值类型


关系操作符的返回值类型是布尔类型,即 int 型的 0 或 1。当关系成立时,返回 1(真),否则返回 0(假)。


2.3 关系操作符在条件判断中的应用


关系操作符常常用于条件判断语句中,例如 if 语句、while 循环等。通过比较两个值的大小关系,我们可以根据条件的真假来执行不同的代码块。


下面是一个使用关系操作符的示例:


int a = 5, b = 10;
if (a == b) { printf("a 与 b 相等\n");} else if (a < b) { printf("a 比 b 小\n");} else { printf("a 比 b 大\n");}
复制代码


在这个示例中,我们比较了变量 a 和 b 的值,并根据比较结果输出不同的结果。


3. 条件操作符


条件操作符(也称为三元运算符、三目运算符)是 C 语言中一种简洁的条件表达式。它允许我们根据条件的真假选择不同的值。


3.1 条件操作符的语法和用法


条件操作符的语法如下所示:


条件 ? 表达式1 : 表达式2
复制代码


如果条件为真,则返回表达式 1 的值;如果条件为假,则返回表达式 2 的值。


通常来讲,是可以支持多条三元运算嵌套的,然而在我看来这并不是写代码的良好习惯,可读性太差!


3.2 条件操作符与 if 语句的对比


条件操作符提供了一种简洁的条件判断方式,它可以替代简单的 if 语句。使用条件操作符可以使代码更加简洁和易读。


下面是一个使用条件操作符的示例:


int age = 18;char* result = (age >= 18) ? "你是成年人" : "你是未成年";
printf("%s\n", result);
复制代码


在这个示例中,我们根据年龄的值选择不同的结果。如果年龄大于等于 18 岁,我们输出"你是成年人";否则,我们输出"你是未成年"。


4. 逻辑操作符


逻辑操作符用于在条件判断中组合多个条件,并根据逻辑关系的真假进行逻辑运算。


4.1 逻辑操作符的种类和用法


C 语言中常用的逻辑操作符包括以下几种:


  • &&:逻辑与(AND)


  • ||:逻辑或(OR)


  • !:逻辑非(NOT)


逻辑与操作符(&&)在两个条件都为真时返回真,逻辑或操作符(||)在两个条件中至少一个为真时返回真,逻辑非操作符(!)用于取反。


4.2 逻辑操作符的短路运算特性


逻辑操作符具有短路运算的特性,即在某个条件已经确定的情况下,将不再计算后续的条件。


下面是一个逻辑操作符短路运算的示例:


int num = 10;
if (num > 0 && num < 100) { printf("Number is between 0 and 100\n");}
复制代码


在这个示例中,如果 num 大于 0,才会继续判断 num 是否小于 100。如果 num 小于等于 0,后续的条件判断将被短路,不再执行。


逻辑与:左假则右不执行,因为一假则假,既然都是假的了,何必浪费时间往右继续判断?

逻辑或:左真则右不执行,因为一真则真,既然都是真的了,那就不用在继续判断啦!


5. switch 语句


现在,让我们来探讨 C 语言中另一个重要的分支语句:switch 语句。


5.1 switch 语句的基本语法和用法


switch 语句是一种用于多分支选择的语句,它根据表达式的值选择不同的执行路径。


switch 语句的基本语法如下所示:


switch (表达式) {    case 值1:        // 执行语句块1        break;    case 值2:        // 执行语句块2        break;    ...    default:        // 默认执行语句块        break;}
复制代码


在这个语法结构中,表达式的值将与每个 case 的值进行比较,如果匹配,则执行相应的语句块。如果没有匹配的 case,则执行 default 语句块(可选)。


下面是一个使用 switch 语句的示例:


int choice = 2;
switch (choice) { case 1: printf("You chose option 1\n"); break; case 2: printf("You chose option 2\n"); break; case 3: printf("You chose option 3\n"); break; default: printf("Invalid choice\n"); break;}
复制代码


在这个示例中,根据变量 choice 的值,我们选择不同的菜单项进行输出。


5.2 switch 语句中的执行顺序问题


在 switch 语句中,case 的执行顺序是从上到下的,即匹配到的第一个 case 执行后,会继续执行后续的 case 语句块,直到遇到 break 语句或 switch 语句结束。


如果在 case 语句块中没有使用 break 语句,将会发生case穿透现象,即执行完一个 case 后,会继续执行下一个 case 语句块,直到遇到 break 语句或 switch 语句结束。


下面是一个"case 穿透"的示例:


int num = 2;
switch (num) { case 1: printf("Number is 1\n"); case 2: printf("Number is 2\n"); case 3: printf("Number is 3\n"); default: printf("Invalid number\n");}
复制代码


在这个示例中,如果 num 的值为 2,将会输出"Number is 2"、"Number is 3"和"Invalid number"。这是因为没有在每个 case 语句块中使用 break 语句,导致执行顺序继续向下执行。


为了避免case穿透问题,我们可以在每个 case 语句块的末尾添加 break 语句,或者使用合适的控制流语句(如 if 语句)来控制执行流程。


5.3 switch 语句的应用场景


switch 语句在实际应用中非常常见,特别适用于根据不同的选择执行不同的操作。


例如,在菜单选择、状态机等场景中,我们可以使用 switch 语句来处理多个固定的选项。


下面是一个使用 switch 语句的示例:


int choice;
printf("Please enter your choice (1-3): ");scanf("%d", &choice);
switch (choice) { case 1: printf("You chose option 1\n"); break; case 2: printf("You chose option 2\n"); break; case 3: printf("You chose option 3\n"); break; default: printf("Invalid choice\n"); break;}
复制代码


在这个示例中,根据用户输入的 choice 值,我们选择不同的菜单项进行输出。


5.4 switch 语句与 if 语句比较



文章转载自:顾平安

原文链接:https://www.cnblogs.com/gupingan/p/17868320.html

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
一文带你掌握C语言的分支结构_算法_不在线第一只蜗牛_InfoQ写作社区