分支和循环语句
C语言是一门结构化的程序设计语言。
语句:C语言中由一个分号;隔开的就是一条语句。
分支语句(选择结构)
if语句
1.语法结构:
①if(表达式)//当if括号中为真时一定执行语句,例if(1)
语句;
②if(表达式)
语句1;
else
语句2;
③多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
2.语句部分如果要执行多条语句应使用代码块
{
...
}
3.常见错误:悬空else
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
上段代码不能通过if与else对齐来判断,当没有{},if与else就近匹配,所以上段代码不打印出任何东西。
若要使第一个if与else匹配
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
printf("haha\n");//最终打印haha
return 0;
}
4.涉及常量和变量相等,最好将常量放在==左边,形式更优。便于发现和减少将==写成=的错误,
#include <stdio.h>
int main()
{
int num = 1;
if (5== num)//若为=,则代码不能成功运行
{
printf("hehe\n");//最终什么也没打印
}
return 0;
}
如果将本段代码改为if(num=5)括号内为赋值语句,恒为真,代码依旧能成功运行,不易查找错误。
switch语句
switch语句常用于多分支的情况。
1.语法结构
switch(整型表达式)
{
语句项;
}
语句项是一些case语句,例
case 整型常量表达式:
语句;
2.
例1
#include <stdio.h>
int main()
{
int day;
scanf("%d",&day);
switch (day)
{
case 1:
printf("星期一\n");
break;//在switch语句中没法直接实现分支,搭配break使用方可实现真正的分支。case如入口,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;
case7:
printf("星期日\n");
break;
}
return 0;
}
例2
#include <stdio.h>
int main()
{
int day;
scanf("%d",&day);
switch (day)
{
case 1://说明case后面的break不一定要加上
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case7:
printf("休息日\n");//在最后一个case后依旧加上break方便未来添加case
break;
default://如果前面的case都没有进去,进入default,default的位置没有严格的限制,通常放到最后
printf("输入错误\n");
break;
}
return 0;
}
循环语句
while循环
1.语法结构
while(表达式)
循环语句;
2.continue 终止循环中本次循环continue后面的代码,直接跳转到循环判断部分,判断是否进行下一次循环。
break 停止后期所有的循环,直接终止循环。(break是永久终止循环)
for循环
1.语法结构
for(表达式1;表达式2;表达式3)
循环结构;
表达式1:初始化部分(用于初始化循环变量)
表达式2:条件判断部分(用于判断循环啥时停止)
表达式3:调整部分(用于循环条件的调整)
2.
int i=0;//循环变量的初始化
while(i<10)//循环变量的判断
{
...;
i++;//循环变量的调整
}
while循环中由于风格的原因,循环的三个必要条件很可能偏离得较远,从而不方便查找修改。
而for循环不存在此问题,因而使用频率更高。
3.
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)//当i==5,执行continue后,跳过了printf和i++,未进行调整,陷入了死循环
continue;
printf("%d", i);
i++;
}
return 0;
}
#include <stdio.h>
int main()
{
int i;
for(i=1;i<=10;i++)
{
if (i == 5)//执行continue后跳到i++,依然能够进行调整
continue;
printf("%d", i);
}
return 0;
}
4.for语句的循环控制变量
①不可在for循环体内修改循环变量,防止for循环失去控制。
#include <stdio.h>
int main()
{
int i;
for (i = 1; i <= 10; i++)
{
if (i = 5)//进入for循环直接赋值5,打印出haha,hehe后+1,进入下一次循环再次直接被赋值5,陷入死循环,所以不能修改循环变量。
printf("haha\n");
printf("hehe");
}
return 0;
}
②建议for语句的循环控制变量采取前闭后开的写法
for(i=0;i<10;i++)
i=0是前闭区间,i<10是后开区间。
从而能清晰的表示10次循环,10个元素,10次打印...但不绝对需要前闭后开,只是建议。
5.
#include <stdio.h>
int main()
{
for (;;)//for循环的初始化,调整,判断都可以省略,但是for循环的判断部分如果被省略,则判断条件恒为真
{
printf("haha\n");
}
return 0;
}
不建议随意省略
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (; i < 10; i++)
{
for (; j < 10; j++)//因为j没有初始化,当i=2时,j依旧为10,无法进入循环
{
printf("haha\n");//最终打印出10个haha
}
}
return 0;
}
6.
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i=0,j=0;j=0; i++,j++)//条件判断部分是赋值语句,零为假,非零为真。此时j=0,不进入循环。
j++;
return 0;
}
若条件判断部分改为j=1,或其他非0数字,则陷入死循环。
do-while循环
1.语法结构
do
循环语句;
while(表达式);
以打印1~10为例
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d",i);
i++;
}
while (i <= 10);
return 0;
}
2.特点:循环至少执行一次,使用场景有限,所以不经常使用。