说明:我是一个初学c语言的小白,很多地方都不是很理解,所以就会自己动手敲代码进行相应的推理验证,希望可爱的你在看到这些步骤时,不要嫌弃我啰嗦。本篇文章内容相对较多,干货满满,有条件的小伙伴可以将文章中的练习和代码动手敲一敲。(吐槽环节:这作者咋这样呀,这么简单的还要敲代码验证,真菜呀!…我:好吧,我不装了,我摊牌了,我确实菜,真的菜,咋滴啦,还不允许初学者菜呀!)
前言
c语言是一门结构化的程序设计语言
有三种基本结构(生活中的所有问题都可以归纳总结到这三种结构或其变式和组合中)
顺序结构、选择结构、循环结构(这三种结构分别是什么意思呢?)
顺序结构就是按照既定的步骤依次执行,从头做到尾。
选择结构就是执行到特定的语句(选择语句),会进行相应的判断,满足条件执行一种路径,不满足条件执行另一种路径。
循环结构就是重复、不间断的执行特点的语句(循环体),满足条件执行或不执行。
画图理解:① 顺序结构 ②选择语句 ③ 循环语句
本章内容包括:
选择结构-- - 分支语句:if | switch
循环结构-- - 循环语句:while | for | do while goto语句
1、什么叫做语句?
概念:C语言中由一个; (分号)隔开的就是一条语句。
int main()
{
int a = 1; //由;隔开的程序句子叫做语句
;//只有一个;没有其它内容,也是一条语句,叫做空语句
return 0;
}
2、分支语句
也叫做选择语句,有选择才会有分支,分支语句可以理解为存在选择的语句。
if的语法结构表达
①if(表达式)
语句;
eg(举例):
#include<stdio.h>
int main()
{
int age = 20;
if (age >= 18)
printf("adult\n");
}
②if(表达式)
语句1;
else
语句2;
eg :
#include<stdio.h>
int main()
{
int age = 10;
if (age >= 18)
printf("adult\n");//成年
else
printf("nonage\n");//未成年
}
③if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
eg :
#include<stdio.h>
int main()
{
int age = 140;
if (age < 18)
printf("young pepole\n");//少年
else if (age >= 18 && age < 26)
printf("youth\n");//青年
else if (age >= 26 && age < 50)
printf("wrinkly\n");//中年
else if (age >= 50 && age < 100)
printf("older pepole\n");//老年
else
printf("the god of longevity!\n");//寿星
return 0;
}
详解:逻辑操作符: && 表示 “且”
eg : if(age >= 18 && age < 26) 这个地方切记不可以直接写成18 <= age < 28,虽然数学中我们是这样书写的,但是在c中会先将(18 <= age)看作一个整体,若条件成立则为真,值为1,条件不成立则为假,值为0,而不管值为1还是0,1 / 0 < 26 恒成立,程序执行得不到我们想要的结果。
为了更好的理解学习分支语句,我们要了解C语言中是如何表示真和假,非0就是真(比如 1、2、3、 - 1等非0,就是真),0就是假
总结:c语言中 0表示假 非0表示真
所以表达式为0,则表示假,条件不成立
表达式非0,则表示真,条件成立
if语句中,单条语句可以直接写,多条语句需要用代码块{}括起来。如果多条语句不带大括号{ }则默认执行第一条语句。
看一下下面这个代码,猜猜会打印什么?(先猜一下,然后对着结果)
结果:什么都不打印
上面的case就是一个悬空else的问题,即else是如何进行匹配的?
else匹配原则: else跟离得最近的未匹配的if进行匹配
再看看下面这个case,猜猜结果是什么?
= 赋值符号 /易与 == 判断相等符号弄混淆
虽然语法不报错,但是结果却不是想要的
为了避免将 == 写成 = 可以将 num == 5 写成 if (5 == num) 若缺少 = 就会报错
将常量放到 == 左边 (好的代码风格,编程老司机)
编程练习题1:
判断一个数是否为奇数(建议先自己动手完成相应的练习,再对照答案)
思路:如何判断一个数是奇数呢?—> % 2 余1 则为奇数,不为1则不是奇数
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)//判断奇数的方法:%2 看余数是否为1
printf("%d是奇数\n", num);
else
printf("%d不是奇数\n", num);
return 0;
}
编程练习题2:
输出1 - 100之间的奇数(建议先自己动手完成相应的练习,再对照答案)
思路:要想输出1 - 100之间的奇数,首先我们要产生1 - 100之间的数字(利用循环产生),判断这里面哪些是奇数,将奇数打印出来。
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
printf("%d ", i);
}
return 0;
}
switch的语法结构表达
这个地方除了刚刚的思路外,还有另外一种思路:根据已有的数学知识,我们知道第一个奇数是1,后面的奇数都是前一个奇数 + 2(这样 % 2之后余数仍然为1),根据这个思路,我们可以这样写:
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 100; i += 2)
{
printf("%d ", i);
}
return 0;
}
当存在多个分支或选择的情况时,如果这时候我们继续选择使用if…else if…else if……就会显得很繁琐。这种语法形式太复杂了,这时候我们可以使用switch语句,用来解决这一类问题非常简单和明了。
switch语句
语法结构 switch(整型表达式)
{
语句项;
}
语句项 case 整型常量表达式:
语句;
case后面的整型常量表达式可以常量,也可以是表达式,比如:可以是 case 1,或case 1 + 0;
另外,字符也属于整型(字符存储的是ASCII值),可以为字符,如case ‘a’: 或 case ‘A’ + 1:
但是不能是变量或变量表达式,比如:不能是 case n;或 case n + 0;也不能是小数(浮点型)比如:不能是 case
1.1、case 0.0 或case 1.1 + 0等 整型(计算机中的一个基本的专业术语,指没有小数部分的数据)即可。
看下面这个例子:通过键盘输入数字将其转换输出成相应的星期
#include<stdio.h>
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;
default:
printf("输入错误\n");
break;
}
return 0;
}
switch的入口是case ,出口是break。
break;直接跳出switch语句,不执行后续操作
default:当case中所有的整型变量表达式均不满足时,执行default中的语句,default可以写在任意case语句可以出现的位置,没有顺序可言,没有强规定将default只能放到前面或后面。(不过一般习惯将default放到后面)
说明:这里的break不一定要有,是否添加break需要根据我们想要达到的效果和程序运行逻辑来定。比如说刚刚那个例子,如果我们想要在输入1,2,3,4,5的时候,打印输出“工作日”,输入6,7的时候,打印输出“休息日”,可以这样写:
#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;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
编程好习惯:
①最后一个break要不要加上?
我们知道最后一个break加不加,程序执行到这里都会跳出去,但是建议加上,为了代码以后的扩展性考虑。(比如后面还需要加上case 8: 若之前case 7:处未添加break,添加case 8:的代码后,程序执行可能会得不到想要的效果。)
②default语句要不要加?
建议加上default:语句,用来处理异常值,并给出相应的提示。
switch语句本身可以嵌套使用
怎么理解这句话呢?下面我们来看一下这个例子 :
#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;
}
先别急着看结果,先猜一下程序运行的结果是什么?
你猜对了吗?
注意:break跳出的是break所在的switch语句。
3、循环语句
循环语句的结构有三种 for\while\do while
while的语法结构
while语句
语法结构:while(表达式)
{
循环语句;
}
在学习循环语句while之前,我们先来看一个例子:
我们知道if(1) 1表示条件为真,所以打印haha(条件成立,执行后面语句)
现在我们将if换成while,再来看这个例子:
会发现执行之后,死循环打印haha。可以看出来while(表达式),只要表达式为真,就会一直执行循环体(条件成立,循环执行后面语句),跟if选择语句的区别是一个条件成立执行一次,一个条件成立一直执行。
再看下面这个例子:
break在while循环的作用:
在循环中遇到break,就停止后期的所有循环,直接终止循环,所以while中的break是用于永久终止循环的
eg:
打印0,1,2,3,4后 i = 5 if条件成立,break跳出程序。所以打印结果为0 1 2 3 4
continue在while循环的作用:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
eg:
实际效果红框部分还在执行,光标还在闪动(程序结束的时候后面会有一句话:按任意键结束程序,这里没有出现),也就是说打印 0 1 2 3 4
后进入死循环了
那么为什么会出现死循环呢?
i = 5之后,if条件成立,执行continue,后面的语句跳过不执行,进入下一次循环,但是在进入下一次循环的时候i没有进行调整,值一直为5,所以进入死循环了!
转载:https://blog.csdn.net/QIYICat/article/details/115691000