前言
在刚刚进入C的世界后,有很多同学对C语言的分支循环结构的语句不是很了解,所以我借着这次机会,想具体讲一下分支和循环,最后还是想让伙伴们在看完之后能真正将这些语句运用到编程中去。学会这些语句,其实已经可以解决编程世界的很多问题了。
介绍语句
C的分支语句分为两种:if语句和switch语句
C的循环语句分为三种:while循环,for循环和do...while循环
接下来我将按顺序分别讲述一下这些语句的用法规则
if语句
if(条件1)//只有在满足条件时才会从一个语句中进入,执行完相应模块然后再整个跳出 { 操作语句; } else if(条件2)//这里的else if ,else等都是可以省略的,而且else if的个数不限,可以有多个 { 操作语句; } else if(条件3) { 操作语句; } else //else在一个分支语句中最多只能有一个,且在不符合以上所有条件时执行 { 操作语句; }
以上时if语句的基本用法,一个大括号里面对应的是和他匹配的相应条件,在一组操作语句执行完之后不会再执行其他语句,直接跳出if语句。
那么大家可能会问:能不能把大括号去掉呢,像以下代码这样
if(条件1) 操作语句; else if(条件2) 操作语句; else if(条件3) 操作语句; else 操作语句;
当然可以,但是这里有一个限制条件就是一个if只能控制一条语句像以下这样
if(a==b)//像这样一个if或else控制两个语句的写法都是错误的 a++; b=a; else a--; a+=b;
一个if或者else如果没有大括号就只能控制其下方一条与其最靠近的语句
接下来,想问大家一个初学者常犯的错误,大家先看看以下代码运行后将输出什么?
#include <stdio.h> int main() { int a = 1; if (a == 0) if (a == 1) printf("haha\n"); else printf("hehe\n"); return 0; }
也许你会说:这不就是一个打印hehe的代码嘛,有什么可问的,但是我还是再建议大家还是动手打以下以上代码运行一下看看将输出什么
最终结果是,将什么都不会输出,在表面上来看其实第一个if和else是对齐的,但是实际上这样看与if else的匹配法则不符。else ,else if是于其最近的if相匹配的,正真与else匹配的是第二个if,这就取决于一开始能否走进第一个if的分支语句后才能进一步判断是否输出hehe。
讲到这,大家是否对分支语句if有了一定的了解呢?接下来,我将给大家介绍第二种分支语句:switch。
switch语句
现在邀请大家用编程解决一个这样的问题:
输入一个小于8的数字分别打印对应一周的七天。
也许大家会写以下代码
#include <stdio.h> int main() { int a; scanf("%d", &a); if (a == 1) printf("周一\n"); else if (a == 2) { printf("周二\n"); } else if//以下省略 。。。。。 return 0; }
但是,这样会不会有些繁杂了呢?于是就有了switch这样的语句来解决以上问题
看以下switch语句运用代码
#include <stdio.h> int main() { int a; scanf("%d", &a); switch (a) { case 1://如果a==1 printf("day1\n"); case 2://如果a==2 printf("day2\n"); case 3: printf("day3\n"); case 4: printf("day4\n"); case 5: printf("day5\n"); case 6: printf("day6\n"); case 7: printf("day7\n"); default://在输入在前7个都不存在时就会从这进入 printf("wrong\n"); } return 0; }
那么输入5后输出结果会是什么呢?
可以看到在输出day5之后又连续输出了day6,直至wrong ,这是怎么回事呢?
原来,在switch语句中,case只代表一个满足条件的入口,在执行完当前语句后会顺着继续往下执行,那么怎么避免此种情况呢?再来看以下代码
#include <stdio.h> int main() { int a; scanf("%d", &a); switch (a) { case 1: printf("day1\n"); break; case 2: printf("day2\n"); break; case 3: printf("day3\n"); break; case 4: printf("day4\n"); break; case 5: printf("day5\n"); break; case 6: printf("day6\n"); break; case 7: printf("day7\n"); break; default: printf("wrong\n"); } return 0; }
break语句的运用可以解决这一问题,让程序从switch语句中直接跳出,这样就不会再出现上面那种情况了。
现在我将再问一个问题:
如果输入1-5时打印工作日,6-7时打印休息日时,应该怎么处理程序呢?
你可能会说,这又什么难的,把前五个输出都改成workday,后两个改成weekend
但是实则可以更加简化,看以下以下代码
#include <stdio.h> int main() { int a; scanf("%d", &a); switch (a) { case 1: case 2: case 3: case 4: case 5: printf("workday\n"); break; case 6: case 7: printf("weekend\n"); break; default: printf("wrong\n"); } return 0; }
以上代码便很好的解决了这个问题
最后再介绍以下switch,里面的case,default之间的顺序都是可以互换的 ,同时case后面所跟的一定是一个字符(要用单引号引起来如:‘a’)或者数字,浮点型放到后面是会报错的