前言:时间一切伟大的壮举都是默默完成的。
大家好,我是战堂、小漠。
目录
1.什么是语句?
C语句可分为以下五类:
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
后面重点介绍的是控制语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,他们由特定的语句定义符组成,c语言有九种控制语句。
可分成以下三类:
1.分支语句(也叫条件判断语句):if语句、switch语句;
2.循环执行语句:do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句。
2.分支语句(选择结构)
好好学习,毕业后找到一个好工作,从此开始走向幸福的生活;
不好好学习,毕业等于失业;
这就是选择。
2.1 if语句
那if语句的语法结构是怎么样的呢?
语法结构:
// 第一种:单分支
if(表达式)
语句;
// 第二种:双分支
if(表达式)
语句1;
else
语句2;
// 第三种:多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
代码举例:
单分支:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main ()
{
int age = 0;
scanf ("%d",&age);
if (age < 18)
{
printf (" 未成年");
}
return 0;
}
双分支:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main ()
{
int age = 0;
scanf ("%d",&age);
if (age < 18)
{
printf (" 未成年");
}
else
{
printf ("成年人");
}
return 0;
}
多分支:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main ()
{
int age = 0;
scanf ("%d",&age);
if (age < 18)
{
printf ("未成年");
}
else if (age >= 18 && age < 30)
{
printf ("青年");
}
else if (age >= 30 && age < 50)
{
printf ("中年");
}
else if (age >= 50 && age < 80)
{
printf ("老年");
}
else
{
printf ("老寿星");
}
return 0;
}
解释一下 :
1.如果表达式的结果为真,则语句执行,反之,则不执行。
在C语言中如何表示真假呢?
在C语言中,0表示假,非0表示真。
2.如果条件成立,需要执行多条语句,则应该使用代码块
if (condition)
{
语句1;
语句2;
}
else if (condition)
{
语句1;
语句2;
}
else
{
语句1;
语句2;
}
上面的一对{} ,就是一个代码块。
2.1.1 悬空else
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main ()
{
int a = 0;
int b = 0;
if (1 == a)
if (0 == b)
{
printf ("hehe");
}
else
{
printf ("haha");
}
return 0;
}
试着猜想一下,这个代码的运行结果是hehe 还是 haha ?
其实都不是,该代码什么都不会输出
运行结果如下:
为什么会这样呢?
因为是第二个if与else匹配,共同构成第一个if的子语句。第一个if表达式不成立,所以程序直接跳出if这个分支语句,跳过了第二个if。
猜错了也不要紧,因为该代码的逻辑和代码风格对初学者实在是不太友好。
改正:
//适当地使用一些代码块,可以使你的代码逻辑让别人看的更清楚。
//良好的代码风格很重要。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main ()
{
int a = 0;
int b = 0;
if (1 == a)
{
if (0 == b)
{
printf ("hehe");
}
else
{
printf ("haha");
}
}
return 0;
}
关于代码风格的书籍,大家可以去看一下《高质量的C/C++编程》
2.1.2 if语句不同书写形式的对比
//代码1
if (condition)
{
return x;
}
return y;
//代码2
if (condition)
{
return x;
}
else
{
return y;
}
//代码3
#include <stdio.h>
int main ()
{
int n = 0;
if (n == 1)
{
printf ("念念不忘必有回响");
}
return 0;
}
//代码4
#include <stdio.h>
int main ()
{
if (1 == n)
{
printf ("大弦嘈嘈如急雨小弦切切如私语");
}
return 0;
}
大家细细看过之后,就知道代码2和代码4的代码更好
代码1相比于代码2对初学者来说比较难理解;
代码4中,if表达式中常量在左,变量在右,这样可以防止将等于号==,错写成赋值号,却无法找到错误
2.1.3 练习
1.判断一个数为奇数
2.输出1~100中的奇数
//代码1
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main ()
{
int n = 0;
scanf ("%d",&n);
if (n % 2 == 1)//也可以写成n % 2 != 0
{
printf ("奇数");
}
return 0;
}
//代码2
//方法1:
#include <stdio.h>
int main ()
{
int n = 1;
while (n <= 100)
{
if (n % 2 != 0)
{
printf (" %d",n);
}
n++;
}
return 0;
}
//方法2:
#include <stdio.h>
int main ()
{
int n = 1;
while (n <= 100)
{
printf (" %d",n);
n += 2;
}
return 0;
}
2.2 Switch语句
Switch语句也是一种分支语句,但常常用于多分支
语法结构:
switch (整型表达式)
{
语句项;
}
什么事语句项呢?
//其实是一些case 语句
//如下:
case (整型常量表达式):
语句;
问题举例:
输入1 输出星期一;
输入2 输出星期二;
输入3 输出星期三;
输入4 输出星期四;
输入5 输出星期五;
输入6 输出星期六;
输入7 输出星期日;
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main ()
{
int day = 0;
scanf ("%d",&day);
switch (day)
{
case 1:
printf ("星期一\n");
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还无法达到我们的使用要求,这就需要一个新的语句---break语句。
2.2.1 break语句
只用Switch和case不能实现真正的分支,只有搭配break语句才可以实现真正的分支。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#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;
}
运行结果:
有时候我们的需求变了
输入1
输入2
输入3
输入4
输入5
需要输出“weekday”
输入6
输入7
需要输出“weekend”
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main ()
{
int day = 0;
scanf ("%d",&day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf ("weekday");
break;
case 6:
case 7:
printf ("weekend");
}
return 0;
}
执行结果:
break语句的实际效果是将语句列表划分成不同的分支部分。
编程好习惯:在最后一个case后加一个break(这样做是为了防止在今后添加新的case语句时,忘记在上次最后一个case后加break,而使代码运行时与我们想要的结果不符)
2.2.2 default
如果表达的值与所有case标签都无法匹配时,会出现什么情况呢?
其实也不用慌,程序不会报错,因为这种情况在C语言中并不算是个错误。
如果我们不想忽略与所有case标签都无法匹配所表达的值,我们只需在Switch语句中任何位置加一个default语句
如果所表达的值与所有case标签都无法匹配时,这时候default语句中的子语句就会执行。
所以一个Switch语句中,只能有一个default语句。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main ()
{
int day = 0;
scanf ("%d",&day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf ("weekday");
case 6:
case 7:
printf ("weekend");
default:
printf ("输入错误");
}
return 0;
}
执行结果:
编程好习惯:在每一个Switch语句中添加一个default语句。
2.2.3 练习
//大家猜想一下下面这个代码的运行结果是什么
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main ()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
n++;
case 2:
m++;
case 3:
switch (n)//switch语句是允许嵌套的
{
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
}
printf ("m = %d n = %d",m,n);
return 0;
}
运行结果:
知识点:Switch语句是允许嵌套的
如果文章对你有用的话就点个关注吧!