当前位置:   article > 正文

c语言初阶

c语言初阶

我前面发表过的《初始c语言》系列文章是对c语言有大概的认识,现在进入了一个全新的阶段,在这个阶段,将对C语言有更深层次的认识,当然,因为C语言编程是一门实践性的学科,所以一定要多练,在文章中,我都会通过举例的形式,去加深对知识点的理解。

本文大纲

分支语句

  • if
  • switch

以及对应的一些题目解析

1. 什么是语句

C 语句可分为以下五类:
  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句

本文主要介绍的是控制语句

控制语句 用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成, C 语言有九种控制语句
可分成以下三类
  •  条件判断语句也叫分支语句if语句、switch语句;
  • .循环执行语句也叫循环语句do while语句、while语句、for语句;
  •  转向语句:break语句、goto语句、continue语句、return语句。

2.分支语句(选择结构)

做分支也就是在做选择,《初始c语言》中简单介绍过选择结构,就是将生活中的选择问题转化为代码的表达

(分支语句)选择结构中有:if语句、switch语句下面介绍以下它们的用法

2.1 if 语句

2.1.1 简单应用(单分支)

语法结构可以分为:

if (表达式)

        语句;

这种是就基本的一种,表示的意思是:如果表达式为真(c语言中规定0为假,非0为真)就会执行语句,一般来说很少会单独用 if,但也举个简单的例子:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int age = 10;
  5. if(age>18)
  6. {
  7. printf("成年\n");
  8. }
  9. if (age == 10)
  10. {
  11. printf("未成年\n");
  12. }
  13. return 0;
  14. }

  if (表达式)

        语句1;

else 

        语句2;

如果表达式为真,语句1就要被执行

如果表达式为假,语句2就要被执行(就是如果……否则的意思)

这是比较常用的一种类型,下面举个例子:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int age = 10;
  5. if (age > 18)
  6. {
  7. printf("成年\n");
  8. }
  9. else
  10. {
  11. printf("未成年\n");
  12. }
  13. return 0;
  14. }
2.1.2 代码风格的重要性

特别注意

 If 和else语句只跟一条语句就不用加大括号{ },因为不加大括号,if或者else都只能识别一条语句,跟多条语句就一定要加大括号,建议:无论一条或者是多条语句都加上大括号{ },下面就举个例子来说明一下代码规范的重要性 :

先猜一下下面的代码的输出是什么?

说明:else匹配规则:else是和它离得最近的if匹配的,就是把红框看作一组(不会因为和谁对齐而看成与它是一组),所以不会打印出任何东西

所以应该如何改正呢?下面给出改正后的代码:

  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. printf("hehe\n");
  10. }
  11. else
  12. printf("xixi\n");
  13. return 0;
  14. }

if的书写形式的对比,再来看一下,下面这个例子:想一下输出是多少

  1. #include <stdio.h>
  2. int test()
  3. {
  4. int a = 4;
  5. if (a == 4)
  6. return 1;
  7. return 0;
  8. }
  9. int main()
  10. {
  11. int r = test();
  12. printf("%d\n",r);
  13. return 0;
  14. }

对比于上面的代码,下面给出另一种书写:对比一下那种更有阅读性呢?

  1. #include <stdio.h>
  2. int test()
  3. {
  4. int a = 4;
  5. if (a == 3)
  6. return 1;
  7. else
  8. return 0;
  9. }
  10. int main()
  11. {
  12. int r = test();
  13. printf("%d\n", r);
  14. return 0;
  15. }

再给个例子(这个凭个人习惯):

  1. #include <stdio.h>
  2. //if的书写形式的对比例二
  3. int main()
  4. {
  5. int num = 3;
  6. if (5 == num)//相当于if(num ==5),这个漏一个等号会报错,将变量赋值给常量是错误的
  7. printf("haha\n");
  8. return 0;
  9. }

所以代码风格是很重要的,想要加强代码风格可以去看一下《高质量C++/C编程指南(李锐)》

2.1.3 多分支结构

if (表达式1)

        语句1;

else if (表达式2)

        语句2;

else 

        语句3;//注意:分支结束的时候一定要用else结尾

以上语句同理,先判断表达式1是否为真,如果为真,就执行语句1,如果表达式1为假,就再判断表达式2是否真,如果为真,就执行语句2,如果所有 if 和else if都中的判断表达式都为假,就执行else中的语句3.

下面举个例子:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int age = 10;
  6. scanf("%d",&age);
  7. if (age < 18)
  8. {
  9. printf("青少年\n");
  10. }
  11. else if (age >= 18 && age < 28)
  12. {
  13. printf("青年\n");
  14. }
  15. else if(age >= 28 && age < 40)
  16. {
  17. printf("中年\n");
  18. }
  19. else if (age >= 40 && age < 60)
  20. {
  21. printf("壮年\n");
  22. }
  23. else if (age >= 60 && age < 100)
  24. {
  25. printf("老年\n");
  26. }
  27. else
  28. {
  29. printf("老寿星\n");
  30. }
  31. return 0;
  32. }
2.1.3 练习

下面举一些例子,让大家对if 语句更加深刻。

练习1、写一段程序,输入一个整数,判断它是否为奇数

答案:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int a;
  6. printf("输入一个整数:");
  7. scanf("%d",&a);
  8. if (a % 2)//或者if(a % 2 == 1)
  9. {
  10. printf("这个数是奇数");
  11. }
  12. else
  13. {
  14. printf("这个数是偶数");
  15. }
  16. return 0;
  17. }

练习2、输出1-100之间的奇数

答案:

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int a = 1;
    5. while (a < 100)
    6. {
    7. if (a % 2)//或者if(a % 2 == 1)
    8. {
    9. printf("%d ", a);
    10. }
    11. a++;
    12. }
    13. return 0;
    14. }

2.2 switch语句

switch也是一种分支结构,常用于多分支,虽然if else也可以写多分支,但过于复杂

比如:要求我们按照输入,来选择输出

输入1,输出星期一

输入2,输出星期二

输入3,输出星期三

输入4,输出星期四

输入5,输出星期五

输入6,输出星期六

输入7,输出星期日

如果用 if else 语句实现:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int day = 0;
  5. scanf("%d", &day);
  6. if (1 == day)
  7. printf("星期一\n");
  8. if (2 == day)
  9. printf("星期二\n");
  10. if (3 == day)
  11. printf("星期三\n");
  12. if (4 == day)
  13. printf("星期四\n");
  14. if (5 == day)
  15. printf("星期五\n");
  16. if (6 == day)
  17. printf("星期六\n");
  18. if (7 == day)
  19. printf("星期日\n");
  20. else
  21. printf("请输入正确的数字");
  22. return 0;
  23. }

if 语句的形式可能会太复杂,那我们就有了不一样的语法形式

这就是switch语句

switch(整型表达式)

{

        case 整型常量表达式

                语句;  

}

2.2.1 在switch语句中的break

在switch语句中,我们没办法直接实现分支,要搭配break使用才能实现真正的分支

比如:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int day = 0;
  6. scanf("%d",&day);
  7. switch (day)//注意switch中的数据类型必须要整型
  8. {
  9. case 1:
  10. printf("星期一\n");
  11. break;
  12. case 2:
  13. printf("星期二\n");
  14. break;
  15. case 3:
  16. printf("星期三\n");
  17. break;
  18. case 4:
  19. printf("星期四\n");
  20. break;
  21. case 5:
  22. printf("星期五\n");
  23. break;
  24. case 6:
  25. printf("星期六\n");
  26. break;
  27. case 7:
  28. printf("星期日\n");
  29. break;
  30. }
  31. return 0;
  32. }

如果在case下不加break,就会按顺序的执行case,直到遇到break或者程序结束。

比如:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. //在比如只需要判断工作日或者是周末
  4. int main()
  5. {
  6. int day = 0;
  7. scanf("%d", &day);
  8. switch (day)//注意switch中的数据类型必须要整型
  9. {
  10. case 1://可以不加break,不跳出,继续循环下面的语句
  11. case 2:
  12. case 3:
  13. case 4:
  14. case 5:
  15. printf("weekday\n");
  16. break;
  17. case 6:
  18. case 7:
  19. printf("weekend\n");
  20. break;//最后一个break可以不加,不加也是因为结束跳出,但建议加上
  21. // default:
  22. // printf("选择错误\n");
  23. // break;
  24. }
  25. return 0;
  26. }

这个例子就会发现,输入1-5的时候,就会按顺序执行到case 5 ,遇到break后退出,如果觉得不明显可以用调试(vs2019按F10,就能看到程序运行的步骤)

正式break的这个特性,使我们代码实现把语句列表划分为不同的分支部分,运用起来更加灵活。

2.2.2 default 子句
如果表达的值与所有的 case 标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在 C 中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条 default 子句,把下面的标签
default
写在任何一个 case 标签可以出现的位置。
switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行
所以,每个 switch 语句中只能出现一条 default 子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个 case 标签一样执行 default 子句。

用上面的例子加入default 改进后:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. //在比如只需要判断工作日或者是周末
  4. int main()
  5. {
  6. int day = 0;
  7. scanf("%d", &day);
  8. switch (day)//注意switch中的数据类型必须要整型
  9. {
  10. case 1://可以不加break,不跳出,继续循环下面的语句
  11. case 2:
  12. case 3:
  13. case 4:
  14. case 5:
  15. printf("weekday\n");
  16. break;
  17. case 6:
  18. case 7:
  19. printf("weekend\n");
  20. break;//最后一个break可以不加,不加也是因为结束跳出,但建议加上
  21. default:
  22. printf("选择错误\n");
  23. break;
  24. }
  25. return 0;
  26. }

说明:上面的程序,输入1-7以外的值时就会输出选择错误

2.2.3 练习

为了巩固switch,下面一个题目,非常经典

阅读以下代码,写出输出。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 1;
  5. int m = 2;
  6. switch (n)
  7. {
  8. case 1:m++;
  9. case 2:n++;
  10. case 3:
  11. switch (n)
  12. {
  13. //switch允许嵌套使用
  14. case 1:n++;
  15. case 2:m++; n++;
  16. break;//只会跳出当前的switch语句
  17. }
  18. case 4:
  19. m++;
  20. break;
  21. default:
  22. break;
  23. }
  24. printf("m = %d, n = %d\n",m,n);
  25. return 0;
  26. }

答案为:m = 5,n = 3

下一篇将介绍循环语句的相关知识

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/930028
推荐阅读
相关标签
  

闽ICP备14008679号