1、顺序结构
逻辑:从程序main函数开始运行,中间没有任何分支,一直按照顺序执行的方式执行到程序末尾
2、分支结构
逻辑:程序中某段代码需要在满足某个条件的时候,才能执行
形式:
1.if语句:表达一种如果条件成立,则...的条件执行关系
int n; scanf("%d", &n); if(n%2==0) { printf("%d是偶数\n", n); }
2.if...else语句:表达一种如果条件成立,则...执行,否则...的一种互斥的关系
int n; scanf("%d", &n); if(n%2==0) { printf("%d是偶数\n", n); } else { printf("%d是奇数\n", n); }
3.if...else的嵌套关系,表达有多路分支
int n; scanf("%d", &n); if(n%2==0) { printf("%d是偶数\n", n); if(n%3==0) { printf("还能被3整除\n"); } else { printf("但是不能被3整除\n"); } } else { printf("%d是奇数\n", n); if(n%4==0) { printf("还能被4整除\n"); } else { printf("但是不能被4整除\n"); } }
注意:
1、if语句是可以单独使用的,但是else是不可以的,else语句必须跟if语句配对使用
2、不管是if语句还是else语句,代码块必须要用大括号{}扩起来,否则,只有首句有效。
3、switch语句
逻辑:根据不同的条件执行不同的代码片段
int n;
scanf("%d", &n);
switch(n)
{
case 1:printf("to day is 星期一\n");break;
case 2:printf("to day is 星期二\n");break;
case 3:printf("to day is 星期三\n");break;
case 4:printf("to day is 星期四\n");break;
case 5:printf("to day is 星期五\n");break;
case 6:printf("to day is 星期六\n");break;
case 7:printf("to day is 星期日\n");break;
default:printf("输入有误\n");
}
要点:
1.switch(n)语句中的n必须是一个整型表达式,即switch进行判断的数据必须是整型,也可以是整型表达式,甚至可以是bool型,因为bool型true表示1,false表示0.
2.case语句只能带整型常量,或者字符型常量,还可以包括整型或者字符型表达式,但是不包括const型数据
3.break语句的作用是跳出整个switch语句结构,没有break,程序会略过case语句往下执行
4.default语句不是必须的,只是一个默认的出错的一个信息提示,一般放在最后面(这个是可以不需要break语句)
4、while与do...while循环
逻辑:让程序中的某一段代码可以重复循环的执行
形式:
while循环:先判断,在循环
do...while循环:先执行一次循环,在判断
while循环示例代码:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int num = 0;
while(num <= 5)
{
printf("num = %d\n", num);
num++;
}
return 0;
}
do...while循环示例代码:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int num = 0;
do
{
printf("num = %d\n", num); num++;
}while(num <= 5);
return 0;
}
语法点:
1.while循环先进行条件判断,条件为真时才执行循环体,因此如果条件为假,循环体可能一次都不执行。
2.while循环括号后面是可以加上分号的,代表这是一个空while循环,这样就可能导致条件成立的时候,变成一个死循环
3.do...while循环中的while语句后面必须要有分号
4.do...while循环,先执行循环体,在进行判断,因此循环体至少会执行一遍
5.do...while循环不一定会比while循环多执行一次
5、for循环
逻辑:与while循环类似,for循环将控制变量集中在一行,使得代码更加紧凑
示例:for(表达式1;表达式2;表达式3)
#include <stdio.h>
int main(int argc, char const *argv[])
{
for (int num = 0; num <= 5; num++)
{
printf("num = %d\n", num);
}
return 0;
}
// 注意:表达式1里面的循环控制变量的定义,在C99标准之前,是会报错误的
语法点:
1.for循环的标准语法:for(表达式1;表达式2;表达式3)
2.表达式1一般用来初始化循环控制变量
3.表达式2一般用来做循环条件的判断,为真进入循环,为假退出循环
4.表达式3一般用来更新循环控制变量
5.三个表达式均可以省略,但是分号不能省略,表达式2省略之后,循环就变成死循环
6、break和congtinue
逻辑:
break:1、跳出switch语句,2、跳出循环体,只跳出当前包含它的循环体
continue:结束当次循环,进入下次循环
break:
int n;
scanf("%d", &n);
switch(n)
{
case 1:printf("to day is 星期一\n");break;
case 2:printf("to day is 星期二\n");break;
case 3:printf("to day is 星期三\n");break;
case 4:printf("to day is 星期四\n");break;
case 5:printf("to day is 星期五\n");break;
case 6:printf("to day is 星期六\n");break;
case 7:printf("to day is 星期日\n");break;
default:printf("输入有误\n");
}
break:
for (int num = 0; num <= 5; num++)
{
printf("num = %d\n", num);
if (num == 3) { break; } }
打印: num=0 num=1 num=2 num=3 int num = 0; while(num <= 5)
{ printf("num = %d\n", num); num++; if (num == 3) { break; } }
7、goto语句
逻辑:无条件跳转 标签名:
举例:
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("%d\n", __LINE__);//__LINE__ 预定义宏:打印当前的行号
goto lab;
printf("%d\n", __LINE__);
lab: printf("%d\n", __LINE__);
return 0;
}
语法:
goto语句直接跳转到本函数中的标签出处,另外的函数里面的标签是跳转不过去的,标签指的是以冒号结尾的标识符。
作用:
用于程序错误处理中
注意:
goto语句的无条件跳转不利于程序的可读性,一般不建议使用