C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语言能够通过语句实现这三种结构,其实就可以通过这三个结构来实现我们的代码。
选择结构(分支结构):我们可以通过 if、switch 语句来实现我们分支结构
循环结构:我们可以通过for、while、do while 语句实现我们的循环语句。
1.if 语句(分支语句)
1.1 if
if语句的语法形式:
if(表达式) 语句;
如果表达式为真,执行语句;如果表达式为假,语句不执行。
这个时候我们可以输入简单的代码,来实现我们的分支语句:
#include <stdio.h> int main() { //先给我们的 a 赋上3的值。 int a = 3; // if 语句来判断a是否等于1。很显然a = 3,那么结果就会打印hehe. if( a == 3 ) printf("hehe"); return 0; } 结果:hehe # 其中 if( a == 3) 中的 == 是表判断,a 是否等于3. #而 = 为赋值,而非判断,如果我们写成if(a = 0) #那么 a 会被赋值0.
在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。
那我们来看例子:
#include <stdio.h> int main() { if(0) printf("hehe"); return 0; }
结果:
并没有打印hehe;
#include <stdio.h> int main() { if(1) printf("hehe"); return 0; }
结果:hehe
所以如果我们将 == 不小心写成了 = ,那么结果就很容易出现问题
1.2 else
if...else...语句让我们实现分支,语法形式:
if(表达式) 语句1; else 语句2;
如果表达式为真,我们就直接执行语句1;如果表达式为假,我们就执行语句2;
#include <stdio.h> int main() { //给一个变量初始化 int a = 0; //我们通过输入一个值,如何将这个值赋给a,下面就是执行程序。 scanf("%d",&a); //分支语句,如果 a 不是0 ,那么就是打印好好学习C语言,如果 a 是 0 ,那么就是打印我要睡懒觉 if(a) printf("好好学习C语言"); else printf("我要睡懒觉"); return 0; }
1.3 分支中包含多条语句
默认在if 和 else 语句中默认都只能控制一条语句。什么意思呢?
无论 if 后面的表达式是否为真,第三行的表达式都会执行。
1|if(表达式) 2| printf("hehe"); 3| printf("haha");
#include<stdio.h> int main() { int age = 0; //输入 scanf("%d",&age); if(age >=18) printf("成年了\n");//\n为换行符,相当于enter回车; printf("可以交女朋友了\n"); return 0; }
无论我们输入的年龄是多少,都会给我们打印可以交女朋友了。
输入:16
结果:可以交女朋友了
输入:18
结果:成年了
可以交女朋友了
我们可以看到 printf("可以交女朋友了\n"); 这条语句是根本不受到 if 语句的控制的。
那么我们来介绍一个可以将它们两条语句进行管控的东西
程序块:{ }
通过程序块,将两个语句括在一起,就能将它们看作一个整体,进行判断执行。
#include <stdio.h> int main() { int age = 0; scanf("%d",&age); if(age>=18) { printf("成年了\n"); printf("可以交女朋友了\n"); } else { printf("未成年\n"); printf("不可以早恋喔\n"); } return 0; }
1.4 嵌套if
else if :
如果我们的分支语句只有两种可能,用 if 和 else来进行两种选择的判断,那是不是太单调了。
我们需要有更多的选择。
#include<stdio.h> int main() { int num = 0; scanf("%d",&num); if(num == 0) printf("输入的数字是0\n"); else if(num>0) printf("输入的数字是正数\n"); else printf("输入的数字是负数\n"); return 0; }
我们其中出现了3个语句:if else if else
我们新出来的else if 我们可能不明白它的意思,但是我再写个代码你们就明白了。
#include<stdio.h> int main() { int num = 0; scanf("%d",&num); if(num == 0) printf("输入的数字是0\n"); else { if(num>0) printf("输入的数字是正数\n"); else printf("输入的数字是负数\n"); } return 0; }
原来elseif 其实就是if 语句嵌套在了else语句当中。由于为了方便,我们写成elseif方便我们书写。
#include <stdio.h> int main() { int age = 0; scanf("%d", &age); if(age<18) printf("少年\n"); else if(age<=44) printf("⻘年\n"); else if(age<=59) printf("中⽼年\n"); else if(age<=90) printf("⽼年\n"); else printf("⽼寿星\n"); return 0; }
我们使用多个elseif 都是没有问题的,我们可以运用elseif 来实现多个选择的分支结构。
1.5 悬空else问题
如果有多个if 和else,可以记得这样一条规则,else总是和更最接近的 if匹配。
#include<stdio.h> int main() { int a = 0; int b = 0; if(a == 1) if(b == 2) printf("hehe\n"); else printf("haha\n"); return 0; }
我们看到else是和 if(a == 1)对齐的,如果说else和 if(a == 1)是匹配的,那么结果就打印haha,
结果是什么都没有打印,为什么会这样呢?
else总是和更最接近的 if匹配。
这个代码实际上是这样子的,下面的else和上面的第一个 if 相匹配
#include<stdio.h> int main() { int a = 0; int b = 0; if(a == 1) { if(b == 2) printf("hehe\n"); else printf("haha\n"); } return 0; }
2.switch 语句(分支语句)
2.1 switch语句和 if 语句的区别
if 语句和switch语句的区别:在多分支中,switch语句相对较为直观,可读性高。
通过题目来比较 if 语句和switch语句的不同:
输入一个1~7的数字,对应打印对应的星期几
if 语句:
#include <stfio.h> int main() { int day = 0; //输入 scanf("%d",&day); if(day==1) printf("星期一\n"); else if(day==2) printf("星期二\n"); else if(day==3) printf("星期三\n"); else if(day==4) printf("星期四\n"); else if(day==5) printf("星期五\n"); else if(day==6) printf("星期六\n"); else (day==7) printf("星期七\n"); return 0; }
switch 语句:
#include<stdio.h> int main() { int day = 0; scanf("%d",&day); switch(day) { case 1: printf("星期一"); break; case 2: printf("星期二"); break; case 3: printf("星期三"); break; case 4: printf("星期四"); break; case 5: printf("星期五"); break; case 6: printf("星期六"); break; case 7: printf("星期七"); break; } return 0; }
2.2 switch语句中的case
switch的语法形式:
switch(变量) { case 值: 语句 1; break; case 值: 语句 2; break; default: 语句 3; break; }
- switch语句中的case用来判断day的值,
如果day为1,那么就会打印下面的语句
- case与后面的值要隔一个空格喔
switch(day) { case 1: printf("星期一"); break; }
day=1
打印:星期一
2.3 switch语句中的break
switch语句中的case后面不需要用程序块{}
如果case表达式为真,后面的语句全部执行
如果case表达式为假,直接跳到下一个case表达式
如果case表达式为真,后面的语句全部执行:
#include<stdio.h> int main() { int day = 0; scanf("%d",&day); switch(day) { case 1: printf("星期一\n"); case 2: printf("星期二\n"); } return 0; }
输入:1
结果:星期一
星期二
这个时候我们就需要有个break来帮助我们跳出switch语句。
#include<stdio.h> int main() { int day = 0; scanf("%d",&day); switch(day) { case 1: printf("星期一\n"); break; case 2: printf("星期二\n"); break; } return 0; }
- 输入:1
结果:星期一
2.4 switch语句中的default
如果前面的case表达式都不满足的话,就会跳到default,执行default后面的表达式。
#include <stdio.h> int main() { int day = 0; scanf("%d", &day); switch(day) { case 1: case 2: case 3: case 4: case 5: printf("⼯作⽇\n"); break; default: printf("休息⽇\n"); break; } return 0; }
其实default和if 语句中的 else有类似之处。