C语言的三大基本结构包括顺序结构,选择结构(也叫分支结构),循环结构,顺序结构顾名思义,就是从头到尾,代码一句接一句的执行下来叫做顺序结构,选择结构是指代码有两种或以上不同的执行方向可以选择执行,到某个节点后,会根据一次判断的结果来决定之后向哪一个分支方向执行且只能选择一个方向,循环结构有一个循环体,循环体就是代码,循环执行循环体内的代码直到出循环.
C语言中的语句可分为五类:即表达式语句,函数调用语句,控制语句,复合语句,空语句。其中,控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句,而控制语句又可分为分支语句,循环执行语句以及转向语句,选择结构以及循环结构就要分别用到选择语句和循环语句今天用此博客来谈谈我对分支语句和循环执行语句的理解.
分支语句有两种形式,即if语句和switch语句.
先来说下if语句的语法结构,
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
}
if(表达式)表示如果表达式为真,则会执行if语句为假则不执行,这是单个if语句的用法.其次,if语句可以有两个或多个分支
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
如图所示,我在if语句后加入了else,else语句必须与if配套使用,即当if语句的表达式为真时则执行if语句内的代码而且不执行else语句里的代码,但当if语句的表达式为假时,则只会执行else语句里的代码,例如:当输入的数为20,则屏幕上打印出“成年”
但如果我想在此之上再对年龄段加以细化,那么就可以用到else if语句
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else if (age <= 30)
printf("青年");
else if (age <= 50)
printf("中老年");
else if (age <= 90)
printf("老年");
else
printf("身体棒");
}
如图所示,当if语句表达式为假时程序就会顺着代码往下执行,首先对于第一个else if语句的表达式进行判断,如果为真则执行该else if表达式里的代码,如果为假程序再继续往下走以此类推直到执行到else语句,假如此时没有任何分支语句的表达式为真,那么就会执行else语句里的代码。
int main()
{
int a = 1;
if (a == 0)
printf("666");
printf("777");
}
我们原本想要的效果是当if表达式为真时输出666和777,但如果写成这样的形式,不论if表达式是否为真,777都会被输出,因为if语句只能控制一条语句
正确的写法应该是在if语句加上{}如下图
int main()
{
int a = 1;
if (a == 0)
{
printf("666");
printf("777");
}
}
到此,大家都该都了解到,else语句必须同if使用相对照,那么如果我写出下面的代码,代码里的else是和哪个if相对照呢?
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
如果运行程序就会发现,程序不会打印任何东西,需要提醒的是,前文说过,if语句只能控制一条语句,而第一个if语句里的if和else语句算一条语句,由此可以说明,else对应的if并不是第一个if,而是第二个,结论:当出现多个if语句与else匹配时,else会选择与它最近的if语句匹配,但我们可以加上大括号来改变这种匹配。
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分隔开,因此此时else与第一个if相匹配,运行当前程序则会在屏幕上打印出“haha”。
switch语句的语法结构://switch (整型表达式)
//{
//语句项;
//}
语句项:case 整形常量表达式: 语句;
即switch(整形表达式),括号里面不能放入浮点数,switch语句中表达式的类型只能是:整形和枚举类型
int main()
{
int day = 0;
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;
}
这段代码运行结果依据day的值发生改变,day对应的值是几,就会找到与case 整形常量表达式之后的与day的值相同的一项并执行,需要注意的是,在每个case后都要加上break,因为当找到相对应的case语句后,程序会从找到的那个位置开始执行,如果不加break,程序就会按照顺序结构将下面的语句都执行,break语句的实际效果是把语句列表划分为不同的分支部分。此外,如果想要实现好几个值对应一个结果,则可以改写程序如下.
int main()
{
{
int day = 0;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
}
如果表达的值与所有的case标签的值都不匹配怎么办?
如果所有的case标签值都不匹配,那么就会执行default语句
int main()
{
{
int day = 0;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
printf("输入错了");
break;
}
return 0;
}
}
该代码day为0,不能与任何一个case相匹配,则就会打印“输入错了”.
for循环的语法:for(表达式1; 表达式2; 表达式3) 循环语句;
表达式1:表达式1为初始化部分,用于初始化循环变量的。 表达式2:表达式2为条件判断部分,用于判断循环时候终止。 表达式3:表达式3为调整部分,用于循环条件的调整。
例子:用for循坏打印出1-10
int main()
{
for (int i = 1; i <= 10; i++)
{
printf("%d ", i);
}
}
表达式1只被执行一次,在循环语句被执行后,先会执行表达式3对变量进行调整,然后再执行表达式2进行判断,如果表达式2为真则再执行循环语句一直循环到表达式2为假出循环。
for循环的变种:for循环中的三个表达式都是可以被省略的
int main()
{
for (;;)
{
printf("hehe\n");
}
}
如图所示,这样写不会导致编译错误,但因为没有条件判断部分,该程序执行后会死循环.
while 语法结构 :while(表达式) 循环语句;即表达式为真则会执行循环语句,执行完之后再去判断表达式真假一直循环直到表达式为假.
例子:使用whlie循环打印1-10
#include
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
do while循环语法:do 循环语句; while(表达式);
do while循环与其他循环不同的是:do while循环不会再在最开始就判断表达式是否为真,而是先执行一次循环语句后再去判断表达式。
例子:使用do while循环打印1-10
#include
int main()
{
int i = 1;
do
{
printf("%d\n", i);
}
while (i <= 10);
return 0;
}