前言
从本篇开始,月亮将带着大家一起在初识C语言的基础之上,对C语言作出进一步的认识。只有一步一个脚印,我们才能掌握的更扎实,收获的更多!好的,今天我们就开始再认识一下控制语句吧!!!
补充
在我们开始之前我们应该知道下面这些内容,这些内容会有助于我们对语句的理解,我们可以看一看!!
C语句可分为以下五类:
1. 表达式语句
2. 函数调用语句
3. 控制语句
4. 复合语句
5. 空语句
本篇后面介绍的是控制语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
1. 条件判断语句也叫分支语句:if语句、switch语句;
2. 循环执行语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句。
通俗的讲,前两种也就是我们所说的分支语句和循环语句。
分支语句
if语句
语法介绍
那if语句的语法结构是怎么样的呢?
语法结构如下:
1. 语法结构: 2. if(表达式) 3. 语句; 4. if(表达式) 5. 语句1; 6. else 7. 语句2; 8. //多分支 9. if(表达式1) 10. 语句1; 11. else if(表达式2) 12. 语句2; 13. else 14. 语句3;
为了更清晰的认识,我们来进行一些演示的程序(从简单到复杂):
1. #include <stdio.h> 2. 3. int main() 4. { 5. int age = 0; 6. scanf("%d", &age); 7. if (age < 18) 8. { 9. printf("未成年\n"); 10. } 11. }
这时我们选择输入一个5,结果如下:
是的,我们输入的5满足了if的条件,所以进入了if语句中打印了未成年的答案!
但是这个程序有一点点小问题:当我们输入大于等于18的数字时,程序没有显示任何东西,这表明我们的程序还不够完善,所以我们做了进一步改进。
那我们再来看一个:
1. #include <stdio.h> 2. int main() 3. { 4. int age = 0; 5. scanf("%d", &age); 6. if (age < 18) 7. { 8. printf("未成年\n"); 9. } 10. else 11. { 12. printf("成年\n"); 13. } 14. }
这是我们改进后的程序,我们运行一下:
我们可以清楚的看到,完善后的代码可以打印出满足相应条件的内容!!!
那如果我们想添加更多的内容怎么办呢?别急,先看下面这个程序
1. #include <stdio.h> 2. int main() 3. { 4. int age = 0; 5. scanf("%d", &age); 6. if (age < 18) 7. { 8. printf("少年\n"); 9. } 10. else if (age >= 18 && age < 30) 11. { 12. printf("青年\n"); 13. } 14. else if (age >= 30 && age < 50) 15. { 16. 17. printf("中年\n"); 18. } 19. else if (age >= 50 && age < 80) 20. { 21. printf("老年\n"); 22. } 23. else 24. { 25. printf("老寿星\n"); 26. } 27. }
这就用到了更多的elseif语句来提供我们所需要的条件。
注意:
如果表达式的结果为真,则语句执行。
那么在C语言中如何表示真假?
0表示假,非0表示真。
如果条件成立,要执行多条语句,怎应该使用代码块?
1. #include <stdio.h> 2. int main() 3. { 4. if(表达式) 5. { 6. 语句列表1; 7. } 8. else 9. { 10. 语句列表2; 11. } 12. return 0; 13. }
这里的一对 { } 就是一个代码块。
按照这个格式书写就可以解决这个问题啦!
悬空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. }
你们猜一猜这个程序运行的结果是什么?是打印hehe嘛?答案是不是,它什么都没有打印。
那么问题的原因在哪里呢?
原因在这里:else的匹配:else是和它离的最近的if匹配的。
当我们运行这个程序的时候,a=0没有满足对应的if条件,而程序中也没有a=0是可以执行的语句,所以什么都没有打印,而代码中后面的else是和离它最近的if相匹配的,所以并没有执行!看到这里想必大家已经理解悬空else的意思了,为了避免这种情况的出现,需要我们养成合理的代码风格。我们看看更改后的程序:
1. #include <stdio.h> 2. int main() 3. { 4. int a = 0; 5. int b = 2; 6. if(a == 1) 7. { 8. if(b == 2) 9. { 10. printf("hehe\n"); 11. } 12. } 13. else 14. { 15. printf("haha\n"); 16. } 17. return 0; 18. }
运行结果:
在这里我们可以看到对{}的使用,对于良好的代码习惯是多么的重要。所以我们要学习这种形式!
if书写形式的对比
1. if (condition) { 2. return x; 3. } 4. return y; 5. //代码2 6. if (condition) 7. { 8. return x; 9. } 10. else 11. { 12. return y; 13. } 14. //代码3 15. int num = 1; 16. if (num == 5) 17. { 18. printf("hehe\n"); 19. } 20. //代码4 21. int num = 1; 22. if (5 == num) 23. { 24. printf("hehe\n"); 25. }
代码2和代码4更好,逻辑更加清晰,不容易出错。
那就有人会问了,3和4有什么区别呢?3和4的效果在这里是一样的,但是实际意义是不一样的,3在这里的条件是判断5是不是等于num,而4判断的是num是不是等于5。有时候我们可能会漏写一个等号,那么就变成了赋值语句啦!!!如果是代码3所写的那样,编译器可能不会报错,这样你就发现不了错误了,而4的写法有效的避免了这种错误,并不会改变num的数值!!!
小练习
1. 判断一个数是否为奇数
(奇数不能被2整除)
1. #include<stdio.h> 2. int main() 3. { 4. //判断一个数是否为奇数 5. int num = 0; 6. scanf("%d", &num); 7. //判断 8. 9. if (num % 2 == 1) 10. printf("奇数\n"); 11. else 12. printf("no\n"); 13. 14. return 0; 15. }
2. 输出1-100之间的奇数
(借助循环和判断奇数的方法)
1. #include<stdio.h> 2. //输出1-100之间的奇数 3. int main() 4. { 5. int i = 1; 6. while (i <= 100) 7. { 8. if (i % 2 == 1) 9. printf("%d ", i); 10. i++; 11. } 12. 13. return 0; 14. }