前言
C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。我们可以使⽤if 、 switch 实现分⽀结构,使⽤ for 、 while 、 do while 实现循环结构。
一、什么是语句?
在我们平时写字中,一句话的结尾是句号,然而正在C语言中一句话的结尾是;
- 语句可以分为以下五类:
1)表达式语句
2)函数调用语句
3)控制语句
4)复合语句
5)空语句
1.1 表达式语句
下面这个就是表达式语句:
3 + 5;
1.2 函数调用语句
函数调用语句,就是将函数进行使用时调用的语句。
printf("%d\n", a); ADD(3, 5);
1.3 控制语句
控制语句
用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。- C语言是由三种结构组成的,有
顺序结构
,选择结构
和循环结构
可分成以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
1.4 复合语句
- 复合语句就是被多个扩号括起来的语句
{ int a = 0; int b = 0; printf("%d\n", a + b); return 0; }
1.5 空语句
- 空语句虽然很简单,但是其用途很大:有时候需要一条语句,但这条语句什么都不需要做
- 例如下面这段代码,我们会后面在字符章节也会详细讲解
while(*dest++ = *src++) { ; }
二、分支语句(选择结构)
- 分支语句可以为双分支或者多分支。
- 在C语言中需要知道真假两个概念:
非0
为真,0
为假(注意:正数和负数
都是真) - 分支语句分为两类:if语句,switch语句。
2.1 if语句
- 那么if语句的语法结构是怎么样的?
if(表达式)//表达式为真执行下面的语句 语句; //单分支语句 if(表达式) 语句1; else 语句2; //多分支语句 if(表达式1) 语句1; else if(表达式2) 语句2; else 语句3;
- 单分支练习(输入大于等于18输出为成年人,否则不输出):
#include <stdio.h>#include <stdio.h> int main() { int age = 0; scanf("%d", &age); if (age >= 18) { printf("成年人\n"); } }
- 单分支练习(输入大于等于18输出为成年人,否则输出未成年人):
#include <stdio.h> int main() { int age = 0; scanf("%d", &age); if (age >= 18) { printf("成年人\n"); } else { printf("未成年\n"); } }
- 多分支练习
#include <stdio.h> int main() { int age = 0; scanf("%d", &age); if (age < 18) { printf("少年\n"); } else if (age >= 18 && age < 30) { printf("青年\n"); } else if (age >= 30 && age < 50) { printf("中年\n"); } else if (age >= 50 && age < 80) { printf("老年\n"); } else { printf("老寿星\n"); } }
2.1.1 悬空else
- 当你写了这个代码:
#include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) if(b == 2) printf("hehe\n"); else printf("haha\n"); return 0; }
- 上面那个代码虽然可以运行,但是风格不是很好
#include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) { if(b == 2) { printf("hehe\n"); } } else { printf("haha\n"); } return 0; }
- 这段代码加上了
{}
使代码变得逻辑更加清楚,要养成更好的代码分格 - 如何写出一个好的代码呢?
这里我推荐
《高质量C/C++编程》
,而这本书就写了如何写出好的风格,大家可以看一下
- 在我们判断是否等于一个变量或者数的时候我们有可能少一个等于号,那么我们怎么避免呢?
//代码1 int num = 1; if(num == 5) { printf("hehe\n"); } //代码2 int num = 1; if(5 == num) { printf("hehe\n"); }
上面的代码哪个比较好?
- 肯定是代码2,因为在判断是否相等时用两个等于号写,这样反过来写就会避免只写一个等于号,只写一个等于号的话会编译错误,可以及时发现。
2.1.2 练习(1. 判断一个数是否为奇数 2. 输出1-100之间的奇数)
- 判断一个数是否为奇数
- 思路:要判断是不是奇数,那么我们就可以看一个数的余数是不是等于1,如果等于1那么这个数就是奇数,否则就是偶数了
int main() { int n = 0; scanf("%d", &n); if (n % 2 == 1) { printf("YES\n"); } else { printf("NO\n"); } return 0; }
- 输出1-100之间的奇数
- 思路:要输出1-100之间的奇数,就要产生1~100的数,然后将每个数进行判断是不是奇数然后再输出
- 我们目前学了
while
循环,那么我们就用while循环来解决这道题~,后面学到了for循环也可以很简便的写出来
方法一:
#include<stdio.h> int main() { int i = 1; while (i<= 100)//产生1~100的数字 { if(i % 2 ==1)//进行判断是否奇数 printf("%d ", i); i++; } return 0; }
方法二:
- 这个方法的话就有点投机取巧了~~
#include<stdio.h> int main() { int i = 1; while (i <= 100)//产生1~100的数字 { printf("%d ", i); //i+=2; i = i + 2;//也可以这样写 } return 0; }
2.2 switch语句
- switch语句也是一种分支语句,常常用于多分支情况~~
比如:
输入1,输出星期一;
输入2,输出星期二;
输入3,输出星期三;
输入4,输出星期四;
输入5,输出星期五;
输入6,输出星期六;
输入7,输出星期七。
- 如果写成if…else if…else if…else的情况就很复杂,那我们需要有不一样的语法形式。
- switch语句(支持嵌套使用)
switch(整形表达式) { 语句项; }
- 而语句项是什么呢?
//是一些case语句: //如下: case 整形常量表达式: 语句;
2.3 switch语句中的break:
- 在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
#include <stdio.h> int main() { int day = 0; switch(day) { case 1: printf("星期一\n"); break; case 2: printf("星期二\n"); break; case 3: printf("星期三\n"); break; case 4: printf("星期四\n"); break; case 5: printf("星期五\n"); break; case 6: printf("星期六\n"); break; case 7: printf("星期天\n"); break; } return 0; }
- 有时候我们的需求变了:
- 输入1-5,输出的是“weekday”;
- 输入6-7,输出“weekend”
- 所以我们的代码就应该这样实现了:
include <stdio.h> //switch代码演示 int main() { int day = 0; switch (day) { case 1: case 2: case 3: case 4: case 5: printf("weekday\n"); break; case 6: case 7: printf("weekend\n"); break; } return 0; }
- 其中break语句的实际效果是把语句列表划分为不同的分支部分。
在这里我推荐一个编程好习惯
- 在最后一个 case 语句的后面加上一条 break语句。
(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句~~)
2.4 switch语句中的default子句:
如果表达的值与所有的case标签的值都不匹配怎么办?
default:
- 写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 - 所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。 - 推荐编程好习惯:
- 在每一个switch语句中都放入一条default语句是一个好习惯,甚至可以在后面加一个break。
2.5 练习
#include <stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1: m++; case 2: n++; case 3: switch (n) {//switch允许嵌套使用 case 1: n++; case 2: m++; n++; break; } case 4: m++; break; default: break; } printf("m = %d, n = %d\n", m, n); return 0; }
上面这段代码的结果是什么呢?
C语言之分支与循环【附6个练习】(一):https://developer.aliyun.com/article/1426993