程序结构与预处理命令
一、程序结构
C语言中,程序结构包含顺序结构、选择结构、循环结构、跳转语句(break,continue,return,goto)
1.1顺序结构
顺序结构:
程序从上往下依次执行,上一条执行完成之后,下一条语句才会执行
1.2选择结构
选择结构
C语言常用的语句有if语句和switch-case语句
1.2.1if语句
a)第一种形式:
if(条件表达式)
{
语句块;
}
原理:只有当条件表达式成立时,执行语句块,否则不执行
条件表达式可以是变量,可以关系表达式
b)第二种形式
if(条件表达式)
{
语句块1;
}
else
{
语句块2
}
原理:只有当条件表达式成立时,执行语句块1,否则执行语句块
c)第三种形式
if(条件表达式1)
{
语句块1;
}
else if(条件表达式2)
{
语句块2
}
else if(条件表达式3)
{
语句块3
}
else
{
语句块n;
}
原理:从条件表达式1开始,进行判断,如果成立,执行语句块1,其他的
语句都不执行(跳出if语句),否则,接着往下判断,知道找到
条件成立的语句,如果条件都不满足,则执行else语句
注意:else跟跟离它最近的if语句配对
符合就近原则
1.2.2switch-case语句
形式:
switch(整型常量表达式)
{
case 数据1: 语句块1;
case 数据2: 语句块2;
case 数据3: 语句块3;
.....
default: 语句块n;
}
原理:整型常量表达式 最终的结果必须是整型常量
因为要跟case后面的数据进行匹配,判断是否相等
如果相等,就会执行该case后面的语句块,知道遇到
} 结束,如果都不跟case后面的数据匹配的话
则,执行default后面的语句
1.3循环结构
do-while语句,while语句,for语句
1)do-while
形式:
do
{
循环体;
}
while(条件判断);
原理:先执行循环体,然后进行条件判断,如果条件成立,则接着
返回去执行循环体,如果条件不成立,则不会再去执行循环体
本质:不管条件判断有没有成立,循环体都会执行一次
2)while
形式:
while(条件判断)
{
循环体;
}
原理:先进行条件判断,如果条件成立,则执行循环体,
如果条件不成立,则不执行循环体
本质:while语句,有可能一次循环体都不会执行
3)do-while 和while语句的区别:
do-while 语句,先执行,后判断,至少会执行一次循环体
while 语句:先判断,后执行,可能一次循环体都不会执行
补充: while(1) 死循环
跳出循环体,break语句
练习:密码门,你忘记密码了,你家密码4位,
如果你输入的密码是对,门开了
如果你输入的密码是错误的,门不会开
3)for语句
1 2 5 4
形式:for(赋值表达式;条件表达式;循环变量表达式)
{
3 6
循环体;
}
赋值表达式:循环变量赋初值
条件表达式:循环体可以结束的条件
循环变量表达式:可以让循环体达到结束的条件
注意:死循环:while(1)
for(;😉
赋值表达式;
形式:
for(赋值表达式;条件表达式;循环变量表达式)
{
循环体;
}
循环的嵌套:
形式:
for(赋值表达式;条件表达式;循环变量表达式)
{
for(赋值表达式;条件表达式;循环变量表达式)
{
}
}
原理:循环嵌套,先执行最外一层循环,接着执行里面的循环的语句
直达里面的循环语句不满足条件,然后在执行外层循环,
依次下去
for(i=1;i<=4;i++)
{
for(j=1;i<=4;j++)
printf("%d\n",j);
break;
}
1.4跳转语句
break,continue,return ,goto
1)break
原理:跳转,
适用于:switch-case,循环结构(do-while,while,for语句)
注意:if 语句里不能用的,除非和if搭配使用在循环结构里
实质:break只能跳出当前循环,或者当前选择结构
结束循环语句,(结束的是离它最近的循环语句)
2)continue
原理:继续
适用于:循环结构
规则:结束本次循环,当前循环结束,接着进行下一轮循环
3)return
形式: return 表达式,return;
第一种形式表示的是,返回一个值,先计算表达式的的值,再返回数值
第二种形式表示的是结束函数
在主函数里面 ,返回值,返回给了系统
在子函数里面,返回值,给上一级函数
在一个函数里面,一旦遇到return语句,函数结束
不管函数里面有几个return语句,遇到第一个return语句,函数结束
4)goto
形式: goto 标签名;
标签名符合标识符的命名规则
本质:真正跳转语句
原理:程序刚开始执行的时候,遇到标签名不会去理会,程序执行遇到
goto语句的时候,程序就会转去执行标签名下的程序
直到某一个条件不满足
注意:只能在同一个函数跳转
在程序中,如果goto语句用的太多,会造成程序代码混乱
二、预处理命令
2.1程序运行过程
预处理指令符号:#
编译程序的四步:
预处理:编译之前完成的
编译:生成汇编文件
汇编:生成目标文件
链接:生成可执行文件
2.2宏定义
分类:无参宏定义,带参宏定义
概念:用宏名替换后面一段繁琐的字符串
1)无参宏定义
形式: 宏名 字符串
指令:define
#define 宏名 字符串
说明: 宏名符合标识符的命名规则
宏名一般大写,便于和变量名进行区分
注意:宏定义纯替换过程,所定义的字符串后面不能加分号
宏定义可以进行嵌套,但是你所嵌套的宏名必须在之前定义好
宏名不是替换打印函数双引号中内容
如果是多条语句,需在所要替换的字符串后面加分号
如果取消宏定义则用 #undef 你要取消的宏名
2)带参宏定义
形式:宏名(参数) 字符串
指令:define
注意: 宏名和参数之间不能有空格
不管带参还是无参,宏定义都只是一个纯替换的过程
2、文件包含
概念:将文件里面的内容,包含到当前文件中
<> :表示到系统下搜索目录
“” :表示到工作目录下去查找
2.3条件编译
条件编译三种形式:
1)第一种形式
#ifdef
程序段1
#else
程序段2
#endif
原理:如果宏名被定义,则执行程序段1,否则执行程序段2
2)第二种形式
#ifndef
程序段1
#else
程序段2
#endif
原理:如果未定义,则执行程序段1,否则执行程序段2
3)第三种形式
#if 条件表达式
程序段1
#else
程序段2
#endif
原理:条件表达式成立,则执行程序段1
否则执行程序段2