1.语句有哪些?
(1)表达式语句
(2)函数调用语句
(3)控制语句
(4)复合语句
(5)空语句
本节介绍的是控制语句。C语言有九种控制语句,可分成以下三类:
1.条件判断语句(分支语句):if语句、switch语句;
2.循环执行语句: do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句。
2.分支语句(选择结构)
2.1 if语句
语法结构:
-
if(表达式)
语句1;
-
if(表达式)
语句1;
else
语句2;
-
if(表达式1)//多分支
语句1;
else if(表达式2)
语句2;
...
else if(表达式n)
语句n;
else
语句n+1;
例如:
#include<stdio.h> int main() { int grade = 0; printf("请输入成绩:"); do//限制输入成绩范围为0—100 { scanf("%d", &grade); if (grade < 0 || grade>100) printf("成绩输入有误,请重新输入:"); } while (grade < 0 || grade>100); /*grade<60 不及格 60<=grade<70 及格 70<=grade<80 一般 80<=grade<90 良好 90<=grade<=100 优秀*/ if (grade < 60) printf("不及格"); else if (grade >= 60 && grade < 70)//新手常见错误:判断条件写成60<=grade<70 //这样会导致程序先去判断grade是否>=60再判断grade是否小于70 printf("及格"); else if (grade >= 70 && grade < 80) printf("一般"); else if (grade >= 80 && grade < 90) printf("优秀"); return 0; }
*若if语句后需执行多条语句,需用{}括起来,比如上述代码中if(grade<60)后要执行多条语句:
if(grade<60) { printf("不及格"); printf("成绩有待提高"); }
*不管执行多条语句还是单条语句,最好都用{}括起来。
2.2 switch语句
语法结构:
switch(整形表达式)
{
case 整形常量表达式1:
语句1;
break;
case 整形常量表达式2:
语句2;
break;
......
case 整形常量表达式n:
语句n;
break;
default: //其它情况,可以没有
语句;
break;
}
例如:
#include <stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: printf("Monday"); break; case 2: printf("Tuesday"); break; case 3: printf("Wednesday"); break; case 4: printf("Thursday"); break; case 5: printf("Friday"); break; case 6: printf("Saturday"); break; default: //或者可以case 7: 不用default: printf("Sunday"); break; } return 0; }
*常见问题:在使用case语句过程中,每种情况末尾没有加break语句,这样会导致该语句后继续执行后面的语句,例如上述代码改为:
int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: printf("Monday\n"); case 2: printf("Tuesday\n"); case 3: printf("Wednesday\n"); case 4: printf("Thursday\n"); case 5: printf("Friday\n"); case 6: printf("Saturday\n"); default: //或者可以case 7: 不用default: printf("Sunday"); break; } return 0; }
当我们输入day为1时,会出现以下结果:
利用此性质,我们以用多个case语句执行同一种情况:
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday");
break;
case 6:
case 7:
printf("weekend");
break;
}
return 0;
}
当我们输入day = 1~5时,均会输出 weekday;
当我们输入day = 6~7时,均会输出 weekend。
3.循环语句
3.1 while语句
语法结构: while(表达式)//当表达式为真时执行下面语句,否则跳出循环执行后面的程序
{
语句; //可以多个语句
}
若不加{},只会循环执行while语句下第一条语句。
如:
#include<stdio.h>
int main()
{
int n = 1;
while (n <= 10) //循环输出1~10
{
printf("%d ",n);
n++;
}
return 0;
}
输出结果如下:
在循环过程中可以用break语句结束循环,如:
#include<stdio.h>
int main()
{
int n = 1;
while (n <= 10) //循环输出n的值
{
if(5 == n) //当n = 5时,结束循环
break;
printf("%d ", n);
n++;
}
return 0;
}
输出结果如下:
可以用continue语句跳过某次循环,如:
#include<stdio.h>
int main()
{
int n = 1;
while (n <= 10) //循环输出n的值
{
if (5 == n) //当n的值为5时
{
n++; //n加1
continue; //跳过本次循环,执行下次循环
}
printf("%d ", n);
n++;
}
return 0;
}
输出结果如下:
3.2 for语句
语法结构:
for(表达式1;表达式2;表达式3)
{
循环语句;
}
若不加{},只会循环执行for语句下第一条语句。
*表达式1为初始化部分,用于初始化循环变量;
表达式2为条件判断部分,用于判断循环什么时候终止;
表达式3为调整部分,用于循环条件的改变调整。
如:
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++) //循环打印1-10
{
printf("%d ", i);
}
return 0;
}
输出结果如下:
3.3 do-while语句
语法结构:
do
{
循环语句;
}while(表达式);
如:
#include<stdio.h>
int main()
{
int i = 1;
do //打印1-10
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
运行结果如下:
4.转向语句
4.1 goto语句 (不能滥用,易出问题)
常在跳出多循环的场景下使用:
//在二维数组中找到指定的数并指出其下标
#include<stdio.h>
int main()
{
int num[3][3] = { 1,2,3,4,5,6,7,8,9 };
int find = 7;//需要寻找的数
int i = 0, j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if (num[i][j] == find)
goto Find;
}
}
Find:printf("找到了,其下标为(%d,%d)", i, j);
return 0;
}
运行结果如下:
*但过多使用goto容易把逻辑弄乱且容易出错,因此不提倡使用。(是否使用根据情况具体判断)
break和continue语句在3.1 while语句中有所说明,此处暂不再介绍。