经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
解密C语言选择结构:掌握条件语句与分支逻辑的利器
来源:cnblogs  作者:Betty’sSweet  时间:2024/2/23 8:57:17  对本文有异议

pFp8UCq.jpg

?? 欢迎大家来到贝蒂大讲堂??

????养成好习惯,先赞后看哦~????

所属专栏:C语言学习
贝蒂的主页:Betty‘s blog

引言

C语?是结构化的程序设计语?,这?的结构指的是顺序结构、选择结构、循环结构。为什么有着三种结构呢,大家其实可以想象一下,生活中的绝大数事情都可以抽象着三种结构,而我们今天要给大家介绍的就是三大结构之一——选择结构

选择结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。它的流程图大致如下:

1. 逻辑运算符

在讲解什么是选择结构前,我们要先了解一些C语言常见的逻辑运算符。

1.1 逻辑取反运算符

逻辑取反运算符的形式特别简单,只需要在需要进行取反操作的变量前+!:

!(变量名)

假设有变量a,它的取反规则如下:

a !a

1.2 与运算符

在C语言中,并不支持数学上的且,而是由一个运算符&&代替的。比如说数学上的0<x<10写成C语言的形式就是x>0&&x<10。

假设有两个变量a,b,与运算符的运算规则如下:

a b a&&b

1.3 或运算符

在C语言中,或者也有专门的运算符表示——||

假设有两个变量a,b,或运算符的运算规则如下:

a b a||b

2. if......else语句

2.1 if语句

if语句是最简单选择结构语法之一,他的语法结构如下:

if ( 表达式 )
语句

表达式成?(为真),则语句执?,表达式不成?(为假),则语句不执?。

C语言特别规定:非零为真,零为假。

例?:输??个整数,判断是否为奇数,如果是奇数打印是奇数

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int num = 0;
  5. scanf("%d", &num);
  6. if (num % 2 == 1)
  7. printf("%d 是奇数\n", num);
  8. return 0;
  9. }
  • 首先输入一个值(num),然后进入if语句判断,如果num%2等于1,条件就为真,就会打印;反之,条件为假,就不会进入打印。

  • 特别注意:C语言中判断是否相等的运算符是==,=是赋值符号。

2.2 else

我们继续以上面例子为列,如果?个数不是奇数,那就是偶数了,如果任意?个整数,我们要清楚的判断是奇数还是偶数怎么表
?呢?
这?就需要 if...else... 语句了,语法形式如下:

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

所以上面的例子可以改写成如下代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int num = 0;
  5. scanf("%d", &num);
  6. if (num % 2 == 1)
  7. printf("%d 是奇数\n", num);
  8. else
  9. printf("%d 是偶数\n", num);
  10. return 0;
  11. }
  • 默认在 if 和 else 语句中默认都只控制?条语句

2.3 多个if else的使用

if else 语句也可以多个同时使用,构成多个分支,形式如下:

if(判断条件1){
语句块1
} else if(判断条件2){
语句块2
}else if(判断条件3){
语句块3
}else if(判断条件m){
语句块m
}else{
语句块n
}

意思是,从上到下依次检测判断条件,当某个判断条件成立时,则执行其对应的语句块,然后跳到整个 if else 语句之外继续执行其他代码。如果所有判断条件都不成立,则执行语句块n,然后继续执行后续代码。

也就是说,一旦遇到能够成立的判断条件,则不再执行其他的语句块,所以最终只能有一个语句块被执行。

我们以下面这段代码举个例子:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int age = 0;
  5. scanf("%d", &age);
  6. if (age > 0 && age < 18) {
  7. printf("少年\n");
  8. }
  9. else if (age >= 18 && age < 30) {
  10. printf("青年\n");
  11. }
  12. else if (age >= 30 && age < 45) {
  13. printf("壮年\n");
  14. }
  15. else if (age >= 45 && age < 55) {
  16. printf("中年\n");
  17. }
  18. else if (age >= 55 && age < 75) {
  19. printf("老年\n");
  20. }
  21. else {
  22. printf("老寿星\n");
  23. }
  24. return 0;
  25. }

假设我们输入的是40,输出:

2.4 if else的嵌套

if else也能嵌套使用,也就是说if执行的语句中也可以包含if else语句。我们用判断三角形来具体说明这个问题:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a, b, c;
  5. while(scanf("%d%d%d", &a, &b, &c)==3)
  6. {
  7. if (a + b > c && a + c > b && b + c > a) {
  8. if (a == b && b == c) {
  9. printf("是一个等边三角形");
  10. }
  11. else if (a == b || a == c || b == c) {
  12. printf("是一个等腰三角形");
  13. }
  14. else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {
  15. printf("是一个直角三角形");
  16. }
  17. else {
  18. printf("是一个普通三角形");
  19. }
  20. }
  21. else {
  22. printf("由%d,%d,%d三边组成的不是三角形", a, b, c);
  23. }
  24. }
  25. return 0;
  26. }

2.5 悬空的else

在书写if....else语句时最好每一条语句后面都加上大括号

至于为什么,我们可以以下面这段代码举例

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a = 0;
  5. int b = 2;
  6. if (a == 1)
  7. if (b == 2)
  8. printf("hehe\n");
  9. else
  10. printf("haha\n");
  11. return 0;
  12. }//输出什么???

输出结果:

为什么会什么结果都没有输出呢?

这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样?条规则, else 总是跟最接近的 if 匹配。最下面的else其实是与if(b==2)这条语句配对的,而不是与if(a==1)配对,当a等于0,自然不会进入任何语句。

3. switch语句

在我们学习多个lf else语句时候就会会发现,如果条件多的话,整个选择结构就会变得很冗杂,所以C语言为了解决这个问题引入了switch,switch 是另外一种选择结构的语句,用来代替简单的、拥有多个分支的 if else 语句。

比如说下面这段代码就会显得十分冗余

  1. int main()
  2. {
  3. int day = 0;
  4. scanf("%d", day);
  5. if(day == 1)
  6. printf("星期一\n");
  7. else if(day == 2)
  8. printf("星期二\n");
  9. else if (day == 3)
  10. printf("星期三\n");
  11. else if (day == 4)
  12. printf("星期四\n");
  13. else if (day == 5)
  14. printf("星期五\n");
  15. else if (day == 6)
  16. printf("星期六\n");
  17. else
  18. printf("星期天\n");
  19. return 0;
  20. }

3.1 switch的基本规则

switch的语法如下:

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

switch语句必须遵循下面的规则:

  1. switch语句中的括号是一个常量表达式,必须是一个整型或枚举类型。

  2. 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。

3.2 break的重要性

学习完switch的语法之后,然后我们可以将最开始的例子改造

  1. int main()
  2. {
  3. int day = 0;
  4. scanf("%d", &day);
  5. switch (day)
  6. {
  7. case 1:
  8. printf("星期一\n");
  9. case 2:
  10. printf("星期二\n");
  11. case 3:
  12. printf("星期三\n");
  13. case 4:
  14. printf("星期四\n");
  15. case 5:
  16. printf("星期五\n");
  17. case 6:
  18. printf("星期六\n");
  19. case 7:
  20. printf("星期天\n");
  21. }
  22. return 0;
  23. }

但是当我们一运行代码就会发现问题:

为什么输入1反而后续的结果都输出了呢?

原因是 switch 语句也是分?效果的,只有在 switch 语句中使? break 才能在跳出 switch 语句,如果某?个 case 语句的后边没有 break 语句,代码会继续玩下执?,有可能执?其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。

所以在 switch 语句中 break 语句是?常重要的,能实现真正的分?效果。

当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

改造代码后;

  1. int main()
  2. {
  3. int day = 0;
  4. scanf("%d", &day);
  5. switch (day)
  6. {
  7. case 1:
  8. printf("星期一\n");
  9. break;
  10. case 2:
  11. printf("星期二\n");
  12. break;
  13. case 3:
  14. printf("星期三\n");
  15. break;
  16. case 4:
  17. printf("星期四\n");
  18. break;
  19. case 5:
  20. printf("星期五\n");
  21. break;
  22. case 6:
  23. printf("星期六\n");
  24. break;
  25. case 7:
  26. printf("星期天\n");
  27. break;
  28. }
  29. return 0;
  30. }

3.3 default的使用

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

其语法如下:

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

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

就?如前?做的打印星期的练习,如果 day 的输?不是1~7的值,如果我们要提?:输?错误,则可以这样完成代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int day = 0;
  5. scanf("%d", &day);
  6. switch (day)
  7. {
  8. case 1:
  9. printf("星期一\n");
  10. break;
  11. case 2:
  12. printf("星期二\n");
  13. break;
  14. case 3:
  15. printf("星期三\n");
  16. break;
  17. case 4:
  18. printf("星期四\n");
  19. break;
  20. case 5:
  21. printf("星期五\n");
  22. break;
  23. case 6:
  24. printf("星期六\n");
  25. break;
  26. case 7:
  27. printf("星期天\n");
  28. break;
  29. default :
  30. printf("输入错误\n");
  31. break;
  32. }
  33. return 0;
  34. }
  • 在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满?实际需求的就可以。不过我们通常是把 default ?句放在最后处理的。

4. 综合练习

4.1 题目一

输入三个整数x,y,z,请把这三个数由小到大输出。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int x, y, z, t;
  5. printf("请输入三个数字:\n");
  6. scanf("%d%d%d", &x, &y, &z);
  7. if (x > y)
  8. { /*交换x,y的值*/
  9. t = x; x = y; y = t;
  10. }
  11. if (x > z)
  12. { /*交换x,z的值*/
  13. t = z; z = x; x = t;
  14. }
  15. if (y > z)
  16. { /*交换z,y的值*/
  17. t = y; y = z; z = t;
  18. }
  19. printf("从小到大排序: %d %d %d\n", x, y, z);
  20. return 0;
  21. }

4.2 题目二

输入某年某月某日,判断这一天是这一年的第几天?

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int day, month, year, sum, leap;
  5. printf("请输入年、月、日,格式为:年,月,日(2015,12,10)\n");
  6. scanf("%d,%d,%d", &year, &month, &day); // 格式为:2015,12,10
  7. switch (month) // 先计算某月以前月份的总天数
  8. {
  9. case 1:
  10. sum = 0;
  11. break;
  12. case 2:
  13. sum = 31;
  14. break;
  15. case 3:
  16. sum = 59;
  17. break;
  18. case 4:
  19. sum = 90;
  20. break;
  21. case 5:
  22. sum = 120;
  23. break;
  24. case 6:
  25. sum = 151;
  26. break;
  27. case 7:
  28. sum = 181;
  29. break;
  30. case 8:
  31. sum = 212;
  32. break;
  33. case 9:
  34. sum = 243;
  35. break;
  36. case 10:
  37. sum = 273;
  38. break;
  39. case 11:
  40. sum = 304;
  41. break;
  42. case 12:
  43. sum = 334;
  44. break;
  45. default:
  46. printf("输入错误\n");
  47. break;
  48. }
  49. sum = sum + day; // 再加上某天的天数
  50. if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {// 判断是不是闰年
  51. leap = 1;
  52. }
  53. else {
  54. leap = 0;
  55. }
  56. if (leap == 1 && month > 2)
  57. { // *如果是闰年且月份大于2,总天数应该加一天
  58. sum++;
  59. }
  60. printf("这是这一年的第 %d 天。", sum);
  61. printf("\n");
  62. return 0;
  63. }

原文链接:https://www.cnblogs.com/bett/p/18028037

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号