C语言的语句可分为以下五类:
其中,控制语句用于控制程序的执行流程,以实现程序的各种结构方式,C语言有九种控制语句。 可分成以下三类:
C语言是结构化的程序设计语言,包含如下结构:
C语言通过分支语句来形成选择结构,通过循环语句来形成循环结构。无论是分支语句还是循环语句都属于控制语句。
if语句有以下三种语法结构:
语法结构:
if(表达式)
语句;
#include
int main()
{
int age = 16;
if (age < 18) //表达式为真,输出未成年
printf("未成年\n");
return 0;
}
if(表达式)
语句1;
else
语句2;
#include
int main()
{
int age = 20;
if (age < 18) //表达式为假,输出成年
printf("未成年\n");
else
printf("成年\n");
return 0;
}
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
else if
来控制多个分支。#include
int main()
{
int age = 59;
if (age < 18)
printf("未成年\n");
else if (age >= 18 && age < 60) //该表达式为真,输出成年
printf("成年\n");
else
printf("老年\n");
return 0;
}
补充:
代码块中可以有多条语句,使用代码块的结构如下:
#include
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
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,else是和if (b == 2)语句匹配的,因此当if (a == 1)中条件不成立时,打印语句就都不会被执行。为了提高代码的可读性,建议修改成如下写法:
#include
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
以上两段代码的功能是相同的,但是由于书写方式不同,可读性就有所不同。
switch语句也是一种分支语句,常常用于多分支的情况。
switch语句的主要语法结构如下:
switch(整型表达式)
{
case 整形常量表达式:
语句;
//...
}
#include
int main()
{
int day = 0;
scanf("%d", &day); //输入为4
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;//输出为星期四 星期五 星期六 星期天
}
虽然在上面这段代码中day选择了case 4,但是由于该情况中没有控制结束,因此switch语句会顺序执行,将case 5、case 6、case 7也执行。
在switch语句中的 break可以把语句列表划分为不同的分支部分。
#include
int main()
{
int day = 0;
scanf("%d", &day);//输入为4
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;//输出为星期四
}
在执行完case 4中的语句后,break控制了该情况结束,跳出并且结束switch语句。
default表示除以上case情况外的所有情况。
#include
int main()
{
int day = 0;
scanf("%d", &day); //输入8
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; //输出为输入错误
}
while循环的语法结构:
while(表达式)
循环语句;
#include
int main()
{
int i = 0;
while (i < 5)
{
printf("%d ", i);
i++;
}
return 0; //输出 0 1 2 3 4
}
while中的break是用于永久终止循环的。在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
#include
int main()
{
int i = 0;
while (i < 5)
{
if (i == 3)
break;
printf("%d ", i);
i++;
}
return 0; //输出为 0 1 2
}
当i=3时,while表达式判断为真执行循环语句,if表达式判断为真,执行break语句终止了while循环。
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
#include
int main()
{
int i = 0;
while (i < 5)
{
i++;
if (i == 3)
continue;
printf("%d ", i);
}
return 0; //输出为 1 2 4 5
}
当i=3时,while表达式判断为真执行循环语句,if表达式判断为真,执行continue语句终止了本次循环,进入了下一次循环。
while循环的大致流程图:
for循环的语法结构:
for(表达式1; 表达式2; 表达式3)
循环语句;
#include
int main()
{
int i = 0;
for (i = 1; i < 10; i++)
{
printf("%d ", i);
}
return 0; //输出为 1 2 3 4 5 6 7 8 9
}
在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
#include
int main()
{
int i = 0;
for (i = 1; i < 5; i++)
{
if (i == 3)
break;
printf("%d ", i);
}
return 0; //输出为 1 2
}
当i=3时,for表达式判断为真执行循环语句,if表达式判断为真,执行break语句终止了for循环。
#include
int main()
{
int i = 0;
for (i = 1; i < 5; i++)
{
if (i == 3)
continue;
printf("%d ", i);
}
return 0; //输出为 1 2 4
}
当i=3时,for表达式判断为真执行循环语句,if表达式判断为真,执行continue语句终止了本次循环,进入了下一次循环。
for循环的大致流程图:
#include
int main()
{
for (;;)
{
printf("hehe\n");
}
return 0; //死循环输出 hehe
}
for循环中的初始化部分,判断部分,调整部分都是可以省略的,全部都省略相当于循环条件永远为真。
#include
int main()
{
int i = 0;
int j = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("hehe\n");
}
}
return 0; //输出为100个hehe
}
for循环进行了嵌套,外层循环循环10次,外层循环每次都执行一次内层循环,一次内层循环执行10次,因此一共是100次。
#include
int main()
{
int i = 0;
int j = 0;
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("hehe\n");
}
}
return 0; //输出为10个hehe
}
for循环进行了嵌套,外层循环循环10次,外层循环每次都执行一次内层循环,第一次内层循环执行10次后,j为10,下一层内层循环没有初始化,j依旧为10,内层循环无法再执行,因此一共是10次。
#include
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("hehe\n");
}
return 0; //输出为2个hehe
}
循环的判断条件是x < 2 && y < 5,循环两次后x<2不再满足,因此只能执行两次。
#include
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
判断条件是k=0,是一个赋值语句,赋值语句的结果为所赋的值,因此该语句的结果为0,循环一次都不执行。
do while循环的语法结构:
do
循环语句;
while(表达式);
#include
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 5);
return 0; //输出 1 2 3 4 5
}
#include
int main()
{
int i = 1;
do
{
if (3 == i)
break;
printf("%d ", i);
i = i + 1;
} while (i <= 5);
return 0; //输出 1 2
}
i=3时,if表达式判断为真,执行break语句终止了循环。
#include
int main()
{
int i = 0;
do
{
i = i + 1;
if (3 == i)
continue;
printf("%d ", i);
} while (i < 5);
return 0;//输出 1 2 4 5
}
i=3时,if表达式判断为真,结束本次循环进行下一次循环。
do while循环的大致流程图:
总结:
C语言中goto语句可以向标志位置进行程序跳转。
#include
int main()
{
printf("hello world\n");
goto flag;
printf("hello goto\n");
flag:
printf("hello blog\n");
return 0; //输出为 hello world hello blog
}
其中flag:
作为标志位供goto语句进行跳转,由于goto语句跳转到了标志位置,会导致中间的代码不被执行。
标志名:
标志位置即可使用goto语句跳转。