目录
1.3.1、将一段if else分支语句代码嵌套在前一个else语句中。
1.3.2、将一段if else分支语句代码嵌套在前一个if语句中
前言
众所周知C语言是一门结构化的程序设计语言,所谓的结构便分为顺序结构、选择结构、循环结构。由if、switch引导的分支语句构成选择结构,而循环结构则是使用for、while、do while语句来实现。
一、选择结构(分支语句)
1、if语句
1.1、if
if语句的基本语法形式如下:
if (表达式)
语句
若表达式成立,即为真时,语句执行。
若表达式不成立,即为假时,语句不执行。
注意!:在C语言中,0为假,非0为真。
1.2、if - else
if else 语句语法形式如下:
if (表达式)
语句1;
else
语句2;
若表达式成立,则执行语句1;若表达式不成立,则执行语句2。
1.3、嵌套if
1.3.1、将一段if else分支语句代码嵌套在前一个else语句中。
例:【在if - else语句中,可以将else和另一个if语句连用(else if)实现嵌套,这样便可构成多重判断】
#include<stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if (score < 60)
printf("没及格\n");
else if (score >= 60 && score < 80)
printf("良好\n");
else
printf("优秀\n");
return 0;
}
1.3.2、将一段if else分支语句代码嵌套在前一个if语句中
例:
#include<stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if (score >= 60)
{
if (score < 80)
printf("良好\n");
else
printf("优秀\n");
}
else
printf("没及格\n");
return 0;
}
1.4、悬空else
当我们遇到含有多个if和else的代码的情况下,阅读时代码的排版经常会带来一些误导性
例:
#include<stdio.h>
int main()
{
int i = 0;
int j = 2;
if (i == 1)
if (j == 2)
printf("hello\n");
else
printf("byebye\n");
return 0;
}
上述代码很多人第一眼可能会马上给出打印"byebye"的答案,但真实答案是什么都没有打印出来,那是因为else其实是和第二格if匹配,而不是和第一个if匹配,大家千万不要被代码的排版所欺骗了。如果同样的代码放在python中,那么就会打印"byebye",那是因为python通过对齐来匹配。
而在C语言中则记住:else总是和最接近的上一个if匹配。
而为了避免这样的问题发生,我们在编写含有多个if和case语句的代码时可以通过适当使用大括号{ },来提高代码的可读性。
1.5、分支中包含多条语句(使用大括号{ }括起来)
例:
#include<stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if (score < 60)
printf("没及格\n");
printf("需要补考\n");
return 0;
}
根据上述代码运行结果可知:无论表达式是否为真,"需要补考"都会打印在屏幕上。
这是因为if语句只控制其下第一条语句的执行,而第二条不受它控制。
若想同时控制多条语句,则代码如下:
#include<stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if (score < 60)
{
printf("没及格\n");
printf("需要补考\n");
}
return 0;
}
加上大括号之后便可发现当表达式为假时什么都没有打印,即第二条语句跟随if语句控制了,同理else想控制多条语句时,也需使用大括号{ }将其下多条代码括起来。
2、switch语句
2.1、switch基本语法形式
switch (整型表达式)
{
case 整型常量1:
语句1;
case 整型常量2:
语句2;
}
(此处只写2个case不代表只能写两个,一个switch语句可以含有多个case)
注意!:case与整型常量之间必须含有一个空格
2.2、switch语句中的break
作用:用来结束整个switch语句
例:
#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;
}
return 0;
}
输入1时,打印“星期一”便执行break即刻跳出switch语句,分别输入2、3、4、5、6、7也是同样的道理。若去掉case语句中的break,会发生什么呢?
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
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");
}
return 0;
}
由上面运行结果不难看出当我们输入1时,打印完“星期一”之后代码并没有停止执行,而是继续执行下面的case语句,因此无法实现分支效果。
所以break在switch语句中是非常重要的存在,不过不是每一个case语句末尾都需要break,可以根据实际情况来适当添加。
2.3、switch语句中的default
在前面我们所介绍的代码中虽然没有default语句也能正常运行代码,但是添加default语句可以完善我们的代码功能,提高严谨度和完整性。
例如前面打印星期几的代码,如果输入的数字不是1~7,那么什么也不会输出。而往往在现实中我们需要给出一个“提示”,那么便需要用到default语句来实现。
#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;
}
二、循环结构
1、while循环
while语句的基本语法形式如下:
while (表达式)
语句;
一眼看去是否有点熟悉的感觉?没错,if语句的语法形式和它非常相似。不过!if语句只执行一次,而while语句则是若表达式为0,循环结束;若表达式为非0,继续执行循环语句。
2、for循环
2.1、for循环基本语法形式
for循环可以说是三种循环中最常用的,也是相对比较重要的,因此我们要熟练掌握。
for(循环变量的初始化:循环是否结束的判断条件:循环变量的调整)
语句;
例如:在屏幕上打印1~5的值
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 5; i++)
{
printf("%d ", i);
}
return 0;
}
结合示例我们可以看到,第一次首先执行for循环的初始化循环变量,再进行判断,若第二个表达式判断为假(0)则退出循环,若判断为真(非0)则开始往下执行循环语句,第一次打印1执行完后,便再去执行第三个表达式变量的调整(这里变为2),接着再去执行第二个表达式进行判断,以此类推进行循环。要特别注意此过程:变量初始化部分只被执行了一次。
2.2、while循环和for循环的对比
for循环和while循环都有“循环变量初始化”,“条件判断表达式”,“循环变量的调整”,只不过for循环将这三个表达式都集中在了一起,这样就不需要像while循环一样到处找,若出现bug可以及时找到问题并修复,同时提高了代码的可读性。
3、do while循环
do while循环的基本语法形式:
书写do while循环的时候我们要特别注意此处的“while(表达式)”后面是有分号“;”的,和while循环不同。
do
语句;
while(表达式);
前面while和for两种循环都是先判断,若条件满足则进入循环;不满足则跳出循环。而do while循环则是第一次先直接进入循环,执行完一次之后再进行判断,若条件满足则再次进入循环;不满足则跳出循环。因此,do while循环语句不管怎样至少会被执行一次。
例如:
#include<stdio.h>
int main()
{
int i = 1;
do
printf("%d ", i);
while (i > 5);
return 0;
}
三、循环结构中的break和continue
break:用于永久终止循环,只要break被执行,则直接立刻跳出此循环,继续往后执行代码。break在三种循环中作用大致一样。
continue:不会直接跳出循环,而是只跳过本次循环中continue后面的代码。在for循环和while循环中的作用过程有所差异。
1、while循环中的continue
#include<stdio.h>
int main()
{
int i = 0;
while (i <= 5)
{
if (i == 4)
continue;
printf("%d ", i);
i++;
}
return 0;
}
分析这一段代码:当 i 循环调整到等于4时,便会执行continue,continue帮助我们跳过后面的两行代码直接回到判断部分,进行下一次循环的判断,此时判断为真,继续执行if语句的判断,i 依旧为4,继续执行continue,代码进入死循环。造成死循环的原因:循环变量的调整部分放在了continue后面。因此在while循环中使用continue需多加注意。
2、for循环中的continue
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 5; i++)
{
if (i == 4)
continue;
printf("%d ", i);
}
return 0;
}
分析上述代码:当循环变量 i 调整到等于4时,便会执行continue,continue同样帮助我们跳过后面的代码,与while循环不一样的是:这里执行完continue是跳到了第三个表达式循环变量调整部分,而不是和while循环一样直接跳到下一次循环的判断部分,这样便避免了死循环的情况。
因此,我们在使用continue时要特别注意循环体内continue后面的内容,因为往往问题会出现在这里。
3、do while中的continue
do while循环中的continue和while循环中的作用几乎一模一样,因为循环变量调整部分的放置位置,结果只会打印出1,2,3,到4便会出现死循环。
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 4)
continue;
printf("%d ", i);
i++;
} while (i <= 5);
return 0;
}