if和else语句都属于控制语句,均只能控制一条语句,当控制多条语句时,需要将多条语句写成代码块,也就是用{}括起来。
单分支语句所谓分支语句就是只有一个if,没有else
例如下面的代码:
#include
int main()
{
int a = 10;
if (10 == a)//为了容易发现将==写成=的错误,将常量放在左边较好
{
printf("hehe\n");
printf("haha\n");
}
return 0;
}
只有一个分支,仅有执行和不执行两种情况,符合条件就执行,不符合就不执行。
多分支语句由多个if和else组成的多分支语句,又分为两种情况。
只有if的情况当有多个if时,每个if都会进行判断是否符合条件
例如以下代码:
#include
int main()
{
int bird = 10;
char life = 0;
char disable = 0;
printf("树上有10只鸟,一只喵跳上去吃了一只还有多少只?\n");
printf("是否有一只鸟是假的?(Y/N)\n");
scanf("%c", &life);
getchar();
printf("鸟是不是残疾不会飞?(Y/N)\n");
scanf("%c", &disable);
if ('N' == disable)//如果是都会飞,则一只都没有了
bird = 0;
if ('Y' == life)//如果有只假的,那这只肯定不会飞走,假设喵咪吃的不是假的
bird = 1;
printf("还剩%d只鸟\n", bird);
return 0;
}
两条if语句按顺序都执行。
if和else都有此时如果if的条件成立,就执行if控制的语句,else包括其控制的语句将不再执行。
例如以下代码:
#include
int mian()
{
int age = 0;
printf("请输入年龄:>\n");
scanf("%d", &age);
//只会执行符合条件的语句,其他语句不会执行和判断
if (age < 18)
printf("未成年\n");
else if (age >= 18 && age < 35)
printf("青年\n");
else if (age >= 35 && age < 60)
printf("壮年\n");
else if (age >= 60 && age < 90)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
只会执行符合年龄条件的那条语句,其他语句包括其他判断都不会执行,提高了效率。
注意:悬空else的问题当代码的格式比较乱时,会出现悬空else的问题,只要记住,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;
}
代码运行结果:
意外吧,什么都没有!!!
原因就是这个代码中的else是和第二个if配对的,这个if—else语句是一条语句,都由第一个if控制,因为a=0,不符合第一个if的条件,所以后面的if—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;
}
这下看明白了吧,由此可见,规范的代码书写是多么重要。
2.switch语句格式:
switch(整型变量或者整型变量表达式)
{
case (整型常量或者整型常量表达式1)
语句1;
break;
case (整型常量或者整型常量表达式2)
语句2;
break;
······
default:
语句3;
break;
以上代码是为了说明格式的,无法运行。
每个case都是一个入口,当进入switch语句后,会从符合的入口进入,然后顺序往下执行,直到遇到break时才会跳出switch语句。
当所有情况都不符合时会从default处进入。
例如以下程序:
#include
int main()
{
int day = 0;
printf("请输入星期几:>");
scanf("%d", &day);
switch (day)//括号内必须是变量,或者是变量表达式,如a+b
{
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");
default:
printf("输入错误\n");
}
return 0;
}
运行结果:
程序从case 1进去后按顺序往下执行,没有遇到break,所以执行到了整个switch语句结束才停止。
加上break后:
#include
int main()
{
int day = 0;
printf("请输入星期几:>");
scanf("%d", &day);
switch (day)//括号内必须是变量,或者是变量表达式,如a+b
{
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;
}
运行结果:
有了beak后,程序从入口进入,从break处跳出switch语句。
default处的break是为了后续在switch语句中再增加情况方便而加的,是一个良好的编程习惯。
break的特性,在以下场景中有应用:
代码如下:
int main()
{
int day = 0;
printf("请输入星期几:>");
scanf("%d", &day);
switch (day)//括号内必须是变量,或者是变量表达式,如a+b
{
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;
}
运行结果:
当输入星期1-5时,无论从哪个入口进入,都在case 5处结束,6和7是同样的到理。
流程图:
打印1-100代码如下:
#include
int main()
{
int i = 1;//初始化
while (i <= 100)//控制语句
{
printf("%d ", i);
i++;//控制调整
}
return 0;
}
运行结果:
如以下代码:
#include
int main()
{
int i = 1;
while (i <= 100)
{
if (50 == i)
break;//当i等于50时,跳出循环
printf("%d ", i);
i++;
}
return 0;
}
运行结果:
此时只打印1-49,因为当i等于50的时候执行了break语句,之间跳出了while循环,后面的数字便不再打印。
如以下代码:
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)//当i等于5时,会执行continue语句,跳过了后面的语句
continue;
printf("%d ", i);
i++;//因为调整语句在continue之后,i等于5后便永不会执行该语句
}
return 0;
}
运行结果:
该结果是1 2 3 4 死循环,因为i等于5后便执行了continue语句,跳过了后面的语句,i得不到调整,就成了i等于5不停的判断是否小于等于10,每次都为真,但每次又执行不到打印语句,所以成了死循环。
如果写成下述这样:
#include
int main()
{
int i = 0;
while (i <= 10)
{
i++;//调整语句在continue之前,会得到调整
if (5 == i)//当i等于5时,会执行continue语句,跳过了后面的语句
continue;
printf("%d ", i);
}
return 0;
}
运行结果:
结果是1-11没有5,当i等于5时执行了continue语句,跳过了后面的语句,所以5不会被打印,但是i又可以得到调整,当调整后i不等于5时,又正常打印并循环。
流程图:
由流程图可以看出,for循环的调整语句是独立于整个循环之外的。
求1!+2!+3!+…+n!的代码如下:
- 使用双层嵌套循环
#include
int main()
{
int i = 0;
int j = 0;
int n = 0;
int ret = 1;//储存每个数的阶乘
int sum = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret = 1;//防止累计,每次内循环结束后都需要直1,这样再次循环才是单纯的求阶乘
for (j = 1; j <= i; j++)
{
ret = ret * j;//求阶乘
}
sum = sum + ret;//结果相加
}
printf("%d\n", sum);
return 0;
}
- 使用一个for循环
#include
int main()
{
int i = 0;
int ret = 1;//储存阶乘
int sum = 0;
int n = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret = ret * i;//不用置1,求下一个数的阶乘时,在上一个数的基础上乘下一个数就可以
sum = sum + ret;//累加
}
printf("%d\n", sum);
return 0;
}
运行结果:
for循环是使用最多的循环,它相比while循环的优势就是初始化和控制条件以及调整写在了一起,在while循环中,当循环体和初始化等内容太长时,需要修改这些参数,因为它们不能在当前程序页面中一起显示,还需要寻找,有时会出现找错改错等情况。总之一句话来讲,就是for循环更加简洁。
break的作用也是终止当前循环当循环是嵌套的双循环或者多循环时,break的作用是跳出当前的这一个循环,即break在哪个for循环中就跳出哪个循环。
正常的9*9乘法表:
#include
int main()
{
int i = 0;
int j = 0;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%2d ", i, j, i * j);//%2d是指域宽是两位,右对齐的方式
}
printf("\n");
}
return 0;
}
运行结果:
加上break后的程序及结果:
#include
int main()
{
int i = 0;
int j = 0;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
if (5 == j)
break;//当i是5的时候跳出内循环
printf("%d*%d=%2d ", i, j, i * j);//%2d是指域宽是两位,右对齐的方式
}
printf("\n");
}
return 0;
}
运行结果:
可以看出,当打印完4j以后,每一行都只有四项,因为当打印第五项时就会跳出内循环,导致ij(j>=5)以后的内容都没有。
continue的在for循环中的作用和在while循环中的作用相同,也是跳过continue之后的语句,之间进行调整并判断。
如以下代码:
#include
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
continue;//当i是5的时候跳过后面的语句,也就是不打印5
printf("%d ", i);
}
return 0;
}
运行结果:
可以看到,本来是打印1-10的,加了continue后,打印的结果是1-10没有5。
如果将contnue换成break会发生什么呢?
#include
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
break;//当i是5的时候跳过后面的语句,也就是不打印5
printf("%d ", i);
}
return 0;
}
运行结果:
可以看到,当打印5时就之间跳出了循环,整个循环就结束了。
流程图:
do—while循环的结构
do
{
语句
}
while;//注意这里必须有分号。
do-while循环的特点是最少都要执行一次。
如以下代码:
#include
//打印1-10
int main()
{
int i = 0;
do
{
i++;
printf("%d ",i);
} while (i < 10);
return 0;
}
运行结果:
将控制条件改成恒为假后:
#include
int main()
{
int i = 0;
do
{
i++;
printf("%d ",i);
} while (0);//0就是恒为假,不再执行
return 0;
}
运行结果:
可以看到结果是1,说明了do—while循环一上来就干,至少会执行一次。
当写一个游戏菜单时,代码如下:
#include
void menu()
{
printf("*****************************\n");
printf("****** 小游戏 ********\n");
printf("******* 1.paly ********\n");
printf("******* 0.exit ********\n");
printf("*****************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>\n");
scanf("%d", &input);//用户输入
switch (input)
{
case 1:
printf("玩游戏\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);//intput的结果充当了控制条件
return 0;
}
运行结果:
在这里使用do—while循环就完美的解决了可以多次循环玩游戏这样问题。
beak的作用也是跳出当前循环如以下代码:
#include
int main()
{
int i = 0;
do
{
i++;
if (5 == i)
break;
printf("%d ",i);
} while (i<=10);
return 0;
}
运行结果:
可以看到,当打印5的时候,便跳出了循环。
如以下代码:
#include
int main()
{
int i = 0;
do
{
i++;
if (5 == i)
continue;
printf("%d ",i);
} while (i<=10);
return 0;
}
运行结果:
可以看到,当打印5时就跳过了,所以打印结果中没有5。
将判断条件里的==写成=会发生什么?
代码如下:
#include
int main()
{
int i = 0;
do
{
scanf("%d", &i);
if (i == 10)
{
printf("hehe\n");
break;
}
} while (i);
return 0;
}
运行结果:
可以看到,只有输入的是10的时候才会打印出hehe。
将==写成=后:
#include
int main()
{
int i = 0;
do
{
scanf("%d", &i);
if (i = 10)
{
printf("hehe\n");
break;
}
} while (i);
return 0;
}
运行结果:
可以看到,无论输入一个什么都会打印hehe,此时的if判断条件失效了。原因是,将==写成=后便成立赋值语句,不是判断语句了,C语言中,把凡是不等于0的数都看作是真(true),所以此时就将一个真赋值给了i,条件永远成立。
break和continue语句的作用在三种循环中的作用是一样的,for循环特殊的一点就是调整语句在循环体外,continue是跳不过调整语句的。写判断条件是注意不要将==写成=号,为了避免这种错误,可以将常量写在判断式的左边。
文章如果对您有帮助,麻烦帮本喵点个赞哦~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)