目录
一、什么是语句
二、分支语句(选择结构)
1.if语句
1.1if语句的语法结构
1.2悬空else
1.3if书写形式的对比
1.4练习
2.switch语句
2.1switch语句
2.2 break语句
2.3 default语句
2.4 练习
三、循环语句
1.while语句
1.2 while语句中的break和continue
2.for循环
2.1for循环的语法结构
2.2 for循环中的break和continue
2.3for循环和while循环
2.4 for 语句中的循环控制变量
2.5一些for循环中的变种
2.6练习
3.do...while()循环
3.1语法结构
3.2 do语句的特点
3.3 do...while循环中的break和continue
四、练习
一、什么是语句
C语言的语句可以分为以下五类:
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,他们由特定的语句定义符组成,C语言有九种控制语句。可分为以下三类:
1.条件判断语句也叫分支语句:if语句、switch语句;
2.循环执行语句:do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句;
二、分支语句(选择结构)选择很好理解,如果你学习,你就可以收获知识;如果你不学习,你就会虚度光阴,这就是个选择。
1.if语句 1.1if语句的语法结构if语句的语法结构是什么样子的呢?
语法结构:
//单分支
if(表达式)
语句;
//双分支
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
来个代码实例,判断年龄,如果年龄大于18,就输出成年
//单分支
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
return 0;
}
再加一点,如果年龄大于18,就输出成年,否则就输出未成年
//双分支
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
再提升一下,让他判断少年青年中年老年几个阶段。
//多分支
#include
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");
}
return 0;
}
通过这几个实例,我们可以明白if语句的基本用法了。如果表达式的结果为真,则语句执行。
那么在C语言中如何判断真假呢?在C语言中,0表示假,非0表示真。
如果条件成立,要执行多条语句,怎应该使用代码块?#include
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
这里的一对
{ }
就是一个代码块。
1.2悬空else
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
这段代码输出的结果是hehe还是haha呢?如果我们运行代码,会发现什么也没输出
这是为什么呢?这是因为else与第二个if相匹配,共同构成第一个if的子语句。第一个if表达式不成立,所以程序直接跳出if这个分支语句,跳过了第二个if,自然也就没有执行else语句,其实如果我们把这段代码复制到编译器上就会发现else是默认跟第二个if对齐的。
通过这个例子我们要明白,else默认和离他最近的if相匹配,而且我们也要意识到写代码规范的重要性,适当的使用{ }可以使代码的逻辑更清楚,
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0; }
我们适当的使用了{ },既避免了出错,又使代码更加美观。
1.3if书写形式的对比//代码1
if (condition)
{
return x;
}
return y;
//代码2
if(condition)
{
return x;
}
else
{
return y;
}
//代码3
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)
{
printf("hehe\n");
}
对比一下四种代码的书写形式,我们会发现代码2和代码4更好,逻辑更加清晰,对比1,2,我们很容易发现代码2书写更好,那为什么对比3和4,代码4更好呢?这是因为代码4中,if表达式中常量在左,变量在右,这样可以防止将等于号==错写成赋值号,却无法找到错误。
1.4练习1.判断一个数是否为奇数
#include
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 == 1) //也可以写成n % 2 != 0 ,因为0为假,非0为真
{
printf("奇数");
}
else
{
printf("不是奇数");
}
return 0;
}
2.输出1-100之间的奇数
#include
int main()
{
int i = 1;
while(i<=100)
{
if (i % 2 == 1)
{
printf("%d ", i);
}
i++;
}
return 0;
}
2.switch语句
switch语句也是一种分支语,常常用于多分支情况。
2.1switch语句语法结构:
switch(整型表达式)
{
语句项;
}
那么什么是语句项呢?
//是一些case语句:
//如下:
case 整形常量表达式:
语句;
注意,switch后边必须是整形表达式,case后边必须是整形常量表达式,如果是浮点数(不是整形)就不可以。
举个例子,
输入1 输出星期一;
输入2 输出星期二;
输入3 输出星期三;
输入4 输出星期四;
输入5 输出星期五;
输入6 输出星期六;
输入7 输出星期日;
代码如下:
#include
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;
}
原理是这样的,我们输入的变量day是几,他就执行case几,假如输入的day是6,他就执行case6,下边运行代码:
我们发现它并不是按我们想输出的那样输出的星期三,而是输出星期三后并且把后边的语句项都走了一遍,都输出了一遍,这是为什么呢?这是因为尽管day是执行的相对于case,从对应的case进入,但是我们没有设置对应的出口,程序不知道在哪出来,然后就继续往后走,全部执行了一遍,所以我们要给case设置对应的出口,让它进入对应的case,执行完就出来,所以这就需要我们引入一个新的语句--break语句。
2.2 break语句 在 switch 语句中,我们没办法直接实现分支,搭配 break 使用才能实现真正的分支。所以,为了实现分支,我们在每个case语句项后都加上break语句。#include
int main()
{
int day = 0;
scanf("%d", &day);
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
这样的需求其实就是,当输入的是1-5时候,对应的case出来的都是weekday,输入6-7时,对应的case出来的都是weekend。那我们就可以这样来写这段代码:
#include
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.3 default语句 如果表达的值与所有的 case 标签的值都不匹配怎么办? 其实也没什么,结构就是所有的语句都被 跳过而已。程序并不会终止,也不会报错,因为这种情况在C 中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?你可以在语句列表中增加一条default 子句,把下面的标签default:写在任何一个 case 标签可以出现的位置。 当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个switch 语句中只能出现一条 default 子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case 标签一样执行 default 子句。 代码:#include
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.4 练习大家猜一下下边代码输出的是什么?
#include
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;
}
我们来梳理一下,n=1,m=2,然后它进入switch语句,执行case 1语句项,n++变成了2,但是没有break作为出口,所以它继续往下执行case 2,m++变成了3,还是没有break,所以执行case 3,进入嵌套的switch语句,因为n= 2,所以直接执行case 2,m++变成4,n++变成3,然后有break,发现出口,跳出,但是这个break是嵌套的switch语句下case 2 的break,所以说最外边的switch下的case 3 语句下并没有break,所以继续执行case 4,m++变成5,然后遇到break,结束,跳出switch,输出m = 5, n = 3。
三、循环语句 1.while语句1.1 while循环的语法结构
//while 语法结构
while(表达式)
循环语句;
while循环的执行流程
表达式为真(非0),进入循环,表达式为假(0),跳出循环
同一件事我们需要做很多次,就可以使用while循环语句来实现,
在屏幕上打印1-10的数字:
#include
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i = i + 1;
}
return 0;
}
执行结果:
我们和前边的if语句结合一下,要求它打印五个换行再打印:
#include
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
if (i % 5 == 0)
{
printf("\n");
}
i = i + 1;
}
return 0;
}
执行结果:
1.2 while语句中的break和continue 上面的代码已经帮我了解了 while 语句的基本语法,那我们再了解一下while中的break和continue。 ①break介绍//break 实例
#include
int main()
{
int i = 1;
while (i <= 100)
{
if (5 == i)
break;
printf("%d ", i);
i++;
}
return 0;
}
执行结果:
从这段代码的执行我们可以明白,while语句中的break是终止循环,其实在while中遇到break,就停止后期的所有循环,直接终止循环,所以,while中的break是永久终止循环。
②continue介绍
continue在循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到循环语句的判断部分。进行下一次循环的入口判断。
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}
我们来猜一猜这一段代码执行的结果应该是什么呢?如果按照我们对continue的理解应该是1 2 3 4 6 7 8 9 10 ,因为5的时候跳出了本次循环,没有被打印,然后开始进入下一次循环判断,但是我们执行发现结果是1 2 3 4
这是为什么呢?这是因为i == 5 的时候,continue跳出了本次循环,后边的语句也没有执行,所以i++并没有被执行,i还是等于5,所以程序陷入了死循环,i一直等于5。我们做下修改。
#include
int main()
{
int i = 0;
while (i < 10)
{
i++;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
这样子打印出来就是没有5的1-10了
2.for循环我们已经学会了while循环,为什么还要学for循环呢?我们先来看for循环的语法结构
2.1for循环的语法结构for(表达式1; 表达式2; 表达式3)
循环语句;
表达式 1 表达式 1 为 初始化部分 ,用于初始化循环变量的。 表达式 2 表达式 2 为 条件判断部分 ,用于判断循环时候终止。 表达式 3 表达式 3 为 调整部分 ,用于循环条件的调整。
for循环的执行流程
练习:使用for循环,在屏幕上打印1-10的数字
#include
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
执行结果
2.2 for循环中的break和continuefor循环中也有break和continue,但是它们的意义和while循环中是一样的。但是还是有些差异:
①break
#include
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
当i=5时,执行break语句,for循环中遇到break,和while中的break一样,就会终止循环。
②continue
#include
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
我们可以发现,for中的continue并没有像while那样在i ==5的时候陷入死循环,这是因为i == 5的时候,执行continue,跳过本次循环,i++变成了6,后边的循环仍然可以正常运行。
2.3for循环和while循环int i = 0;
//实现相同的功能,使用while
i = 1;//初始化部分
while (i <= 10)//判断部分
{
printf("hehe\n");
i = i + 1;//调整部分
}
//实现相同的功能,使用for
for (i = 1; i <= 10; i++)
{
printf("hehe\n");
}
可以发现在
while
循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for
循环的风格更胜一筹;
for
循环使用的频率也最高。
2.4 for 语句中的循环控制变量
1.不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for (i = 0; i < 10; i++)
{}
//两边都是闭区间
for (i = 0; i <= 9; i++)
{}
2.5一些for循环中的变种
#include
int main()
{
//代码1
for (;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
//代码2
int i = 0;
int j = 0;
//这里打印多少个hehe?
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("hehe\n");
}
}
//代码3
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("hehe\n");
}
}
//代码4-使用多余一个变量控制循环
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
2.6练习
//请问循环要循环多少次?
#include
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
请问这个循环执行多少次,答案是0次,因为k=0是赋值,k被赋值为0,0为假,循环不执行。
3.do...while()循环 3.1语法结构do
循环语句;
while (表达式);
执行流程
3.2 do语句的特点 循环至少执行一次,使用的场景有限,所以不是经常使用。#include
int main()
{
int i = 10;
do
{
printf("%d\n", i);
} while (i < 10);
return 0;
}
3.3 do...while循环中的break和continue
①break
#include
int main()
{
int i = 1;
do
{
if (5 == i)
break;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
break在do...while循环中的作用也是终止循环。
②continue
#include
int main()
{
int i = 1;
do
{
if (5 == i)
continue;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
我们发现也是死循环,这是因为当i ==5时,执行continue,然后后边的语句不再执行,直接跳出本次循环,进行do...while语句的判断部分,但是i++在continue之后,i没有发生变化,所以陷入死循环。
四、练习给大家出两道简单的练习题,大家可以联系一下,顺便加深理解和印象。
1、计算 n的阶乘。
2、计算1!+2!+3!.....+10!
//计算n的阶乘
#include
int main()
{
int n = 0;
int i = 0;
int ret = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret *= i;
}
printf("%d\n", ret);
return 0;
}
计算1!+2!+3!.....+10!
#include
int main()
{
int i = 0;
int j = 0;
int t = 1;
int sum = 0;
for (i = 1; i <= 10; i++)
{
t = 1;
for (j = 1; j <= i; j++)
{
t = t * i;
}
sum += t;
}
printf("%d\n", sum);
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)