文章目录
- 前言
- 1. if 语句
- 1.1 if 语法结构
- 1.2 悬空 else
- 1.3 “ = ” 号引发的错误
- 1.4 if 语句练习题
- 2. switch 语句
- 2.1 switch 语法结构
- 2.2 在switch语句中的 break
- 2.3 default 子句
- 2.4 switch 语句练习题
前言
- C语言是一门结构化的程序设计语言;
- 它分为:顺序结构、选择结构、循环结构。
顺序结构
- [X]从头走到尾,一条道走到黑,中间没有进行选择之类的拐弯抹角。
选择结构
- 分支语句也叫做选择语句;
- 生活中处处充满了选择,如果(if)你好好学习,等毕业了就能拿一个好 offer,否则(else)就回家卖番薯,这就是选择!
循环结构
- 生活中可能需要把一件事反复的去做,这种情况就称之为循环。
总结
- 生活中的所有事情都可以抽象成这三种结构的某一种,或者这三种结构的组合来描述清楚生活中所有的事情。
- C语言中就提供了能够描述这几种结构的能力:
- 顺序结构:实在没啥好说的,就一条道走到黑就完了;
- 选择结构:if、switch 语句;
- 循环结构:for、while、do while 语句。
1. if 语句
1.1 if 语法结构
单分支结构
if(表达式)
{
语句;//若表达式结果如果为真,则执行语句内容,反之不执行
}
if(表达式)//若表达式结果为真,则执行语句 1,反之执行语句 2
{
语句1;
}
else
{
语句2;
}
多分支结构
if(表达式1)
{
语句1;
}
else if(表达式2)
{
语句2;
}
else
{
语句3;
}
- 有的时候需要做的选择可能不止两种;
- 假设有 3 4 5 …更多种选项,简单的 if else 就不能够满足了,此时就需要使用到多分支。
- 注:当只有一条语句时,可以不用大括号。
#include <stdio.h>
//当有多个选择时,就要加上 else if 来实现多分支结构
int main()
{
int age;
scanf("%d", &age);
if (age < 18)
printf("青少年\n");
else if (18 <= age && age < 28)
printf("青年\n");
else if (age >= 28 && age < 40)
printf("壮年\n");
else if (age >= 40 && age < 60)
printf("中年\n");
else if (age >= 60 && age <= 100)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
正确使用大括号
- 条件成立时,如果有多条语句,就必须要用大括号将语句内容框柱。
#include <stdio.h>
int main()
{
int age;
scanf("%d", &age);
if (age < 18)
printf("青少年\n");//只有这一条语句,可以不用加大括号
else if (18 <= age && age < 28)
{
//条件成立时,如果有多条语句时,就必须要用大括号将语句内容框柱
printf("青年\n");
printf("不香翅捞饭就遵纪守法")
}
return 0;
}
- 这里的一对 { } 就是一个代码块。
1.2 悬空 else
else的匹配
- else 是和它离的最近的 if 匹配的。
举个栗子
- 下列代码的结果是什么?
#include <stdio.h>
int main()
{
int a = 0, b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
啥也不会发生
- 之前也说过,else 只会和离它最近的 if 进行匹配,当我们把这段代码拷进 VS 底下时 else 的位置其实是这样的:
改进
- 适当的使用 { } 可以使代码的逻辑更加清楚。
- 代码风格很重要,写出漂亮的代码不仅仅只是为了方便阅读,同时也能有效的减少 BUG 的产生。
#include <stdio.h>
//改成这样就能更好的进行阅读了
int main()
{
int a = 0,b=2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
1.3 “ = ” 号引发的错误
- 在C语言中,如果只有一个 = 号是赋值的意思,有两个 == 号才是判断是否相等;
- 如果在 if 语句的表达式中,不小心采用的是赋值符号,则表达式结果永远为真,并且这种情况编译器还不会报错;
- 解决方法:判断变量和某个数是否相等时,应该将变量置于表达式的右边,这样就不需要担心会一不小心少敲一个 = 了;
- 因为在 C 语言中,是绝对不会允许给一个常量赋一个变量的。
1.4 if 语句练习题
1. 判断一个数是否为奇数
- 用这个数模上一个 2,余数为 1 的是奇数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
//奇数除于的余数为1
if (1 == num % 2)
{
printf("%d 是奇数\n",num);
}
else
{
printf("%d 不是奇数\n", num);
}
return 0;
}
输出1-100之间的奇数
- 找出 1-100 中所有 % 2 的结果为 1 的数。
#include <stdio.h>
int main()
{
int num = 1;
while (num <= 100)
{
if (1 == num % 2)
{
printf("%d ", num);
}
num++;
}
printf("\n");
}
2. switch 语句
- switch语句也是一种分支语句,常常用于多分支的情况。
举个栗子
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
- 这种情况下,写成 if…else if …else if 的形式太复杂,那我们就得有不一样的语法形式。
- 这就是 switch 语句。
2.1 switch 语法结构
switch(整型表达式)
{
语句项;
}
语句项
- switch 语句的语句项是一些 case 语句:
case 整形常量表达式:
语句;
举个栗子
#include <stdio.h>
int main()
{
int day;
scanf("%d", &day);
switch (day) //根据day的值来判断
{
case 1:printf("星期一\n");//day的值是1的话执行这条语句,下同理
case 2:printf("星期二\n");
case 3:printf("星期三\n");
case 4:printf("星期四\n");
case 5:printf("星期五\n");
case 6:printf("星期六\n");
case 7:printf("星期天\n");
}
return 0;
}
- 这和俺们想要得到的结果貌似不太一样啊;
- switch 语句中得 case 只是决定了入口,但没说哪里是出口,没有出口只好把 switch 语句的中得内容全部执行完一遍才能结束了;
- 此时就需用到 break 来决定 switch 语句的出口在哪了。
2.2 在switch语句中的 break
- 在 switch 语句中,我们没办法直接实现分支,搭配 break 使用才能实现真正的分支。
举个栗子
#include <stdio.h>
int main()
{
int day;
scanf("%d", &day);
switch (day) //根据day的值来判断
{
case 1:printf("星期一\n"); break;
//当 day 的值是1时打印星期一,然后结束整个switch语句,下同理
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>
//使用break来决定分支
int main()
{
int day ;
scanf("%d", &day);
switch (day)
{
case 1://case 后面不加 break 的话是会照顺序往后走的
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.3 default 子句
- 如果表达的值与所有的case标签的值都不匹配怎么办?
- 在上述代码中,如果有人输入了个 8、10、500 怎么办?
- 此时就需要使用 default 子句来提示输入错误了。
default
- 输入的所有不能与 case 匹配的值都走到 default 这来。
- 所以,每个 switch 语句中只能出现一条 default 子句。
2.4 switch 语句练习题
- 下面代码的结果是什么?
#include <stdio.h>
int main()
{
int n = 1,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;
}
- 答案是 m = 5,n = 3
题目解析
#include <stdio.h>
int main()
{
int n = 1,m=2;
switch (n)//n = 1,执行 case 1 的内容
{
case 1:m++;//m = 3,没有 break 继续往下执行
case 2:n++;//n = 2,没有 break 继续往下执行
case 3:
switch (n)//n = 2,执行 case 2 的内容
{
case 1:n++;
case 2:m++;n++;break;//m = 4,n = 3
//有 break,跳出这个 case 2 所在的 switch语句
}
case 4:m++;break;//m = 5,有 break 跳出这个 switch
default:break;
}
printf("m = %d, n = %d\n", m, n);//m = 5,n = 3
return 0;
}