C程序结构
C程序基本结构:
#include<文件名>
类型标识符 main( )
{
函数体
}
一、编译预处理
编译预处理是指在编译前对源程序进行的一些预加工。预处理是指在进行编译的第一遍扫描之前所做的工作。预处理是C语言的一个重要功能,它由编译系统中的预处理程序按源程序中的预处理命令执行。
C语言的预处理命令均以“#”开头,末尾不加分号,以区别于C语言。
C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能能使编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。
常用的几种预处理功能:
1.宏定义
在C语言源程序中,允许使用一个标识符表示一个字符串,称为宏。被定义为宏的标识符称为宏名。在编译预处理时,对于程序中的所有宏名,都用宏定义中的字符串替换,称为宏替换或宏展开。
宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。在C语言中,宏分为无参数和有参数两种
- 无参宏定义
无参宏定义的宏名后没有参数,其定义的一般形式为
#define 标识符 字符串
作用:用一个指定的标识符代表一个字符串。
- 有参宏定义
宏定义中的参数称为形式参数,宏调用中的参数称为实际参数。对于带有参数的宏,在调用中不仅要宏展开,而且要用实参代替形参。
其一般形式为:
#define 宏名(形参表) 字符串
- 有参宏调用一般形式
宏名(实参表)
2.文件包含
文件包含是指一个文件可以将另一个文件的全部内容包含进来。C语言使用#include命令行实现文件包含功能,命令格式为
#include”文件名”
或#include<文件名>
- #include的两种用法
一种为:#include<stdio.h>
另一种为:#include”stdio.h”
使用尖括号< >和使用双引号” ”的区别在于头文件的搜索路径不同:
Ø使用尖括号< >,编译器会到系统路径下查找头文件;
Ø而使用双引号“ ”,编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。
- #include用法的注意事项
Ø一个#include命令只能包含一个头文件,多个头文件需要多个#include命令。
Ø同一个头文件可以被多次引入,多次引入的效果和一次引入的效果相同,因为头文件在代码层面有防止重复引入的机制。
Ø文件包含允许嵌套,也就是说在一个被包含的文件中又可以包含另一个文件。
二、函数
C语言有一个或多个程序文件构成,每个文件由一个或多个函数构成,通过函数之间的相互调用完成工作。一个C程序中必须有且仅有一个主函数(main函数),C程序从主函数开始执行,在主函数结束。
每个C语言编译系统都提供了标准库函数,程序设计中的许多常用功能都可以在标准库函数中找到。标准库函数的功能通过一批头文件描述,当在程序中使用莫类函数时,需要将其所在的头文件用#include命令包含到本程序文件中。
标准库函数的数量有限,不可能满足每个用户的特定需求,因此,C语言允许用户定义自己的函数,称为用户自定义函数。
标准函数和用户自定义函数都可分为有参函数和无参函数两类。
函数一经定义,就和系统提供的标准函数的用法一致。
1.函数的定义
- 无参函数的定义一般形式为:
类型标识符 函数名()
{
函数体
}
- 有参函数的定义一般形式为:
类型标识符 函数名(形式参数表列)
{
函数体
}
2.函数的组成部分
返回类型:一个函数可以返回一个值。
函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
参数:参数就像是占位符。当函数被调用时,您向函数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
函数主体:函数主体包含一组定义函数执行任务的语句。
3.函数的调用
除了主函数之外,程序中的其他函数只有在被调用时才会被执行。调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数。
函数调用的一般形式为:
函数名(实参表列)
调用无参函数时,函数名后面跟一对空的括号,即函数调用时括号不能省略;当实参有多个时,中间用逗号分隔。
- 实参
调用函数时,函数名后面的括号内的表达式称为实际参数(简称实参);
- 形参
定义函数时,函数名后面的括号内的变量名称称为形式参数(简称形参)。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
- 调用函数的两种方式
传值调用:
该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
引用调用:
通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
默认情况下,C使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数。
4.return语句
return语句的作用是将流程返回至调用处。
- 如果函数是纯粹计算函数,则由return语句返回一个计算结果,这个结果由return后面的表达式给出,表达式可以用括号括起来,也可以不括起来。
- 对于完成一个具体工作的函数,可以返回完成结果,如printf函数执行成功后会返回显示的字节数,执行失败时会返回一个负整数。
- 对于无返回值的函数,return语句的后面不带表达式,此时不返回任何值,仅将流程转回主调函数。如果不带表达式的return语句位于函数的最后,则可以省略return语句,这时,当执行到表达函数结束的右花括号时,流程会返回到主调函数。
一个函数中可以有多个return语句,不管执行到哪个return语句,流程都会返回到主调函数;一个函数中有多个return语句并不代表这个函数可以同时求出多个值,函数的返回值只能有一个,要想从函数的调用中得到多个变化的值,需要另想办法。
C语言的基本语法
1.注释
使用//进行单行注释,使用/* */进行多行注释。注释的内容编译器是忽略的,注释的主要作用是在代码中加一些说明和解释,这样有利于代码的阅读。
2.关键字
关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字,C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。
- 数据类型关键字
void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果
char:字符型类型数据,属于整型数据的一种
int:整型数据,通常为编译器指定的机器字长
float:单精度浮点型数据,属于浮点数据的一种
double:双精度浮点型数据,属于浮点数据的一种
short:短整型数据,属于整型数据的一种
long:长整型数据,属于整型数据的一种
signed:有符号数据类型
unsigned:无符号数据类型
enum:声明枚举类型
struct:声明结构体变量
union:声明共用体数据类型
- 控制语句关键字
for:for循环语句关键字
do:do循环结构
while:while循环结构
break:跳出当前循环
continue:结束当前循环,开始下一轮循环
if:条件语句关键字
else:条件语句否定分支
goto:无条件跳转语句(条件语句关键字)
switch:用于开关语句
case:开关语句分支
default:开关语句中的“其他”分支
return:子程序返回语句
- 存储类型关键字
auto:声明自动变量,由编译器自动分配及释放。通常在栈上分配
extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明对象的一个“引用”
register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
- 其他关键字
const:声明常类型,常类型的变量或对象的值是不能被更新的,可使用在常量定义,指针定义,函数定义等处,与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
sizeof:用于计算特定类型或特定类型变量的数据类型长度
typedef:常规变量类型定义,数据类型取别名,指针类型定义,函数地址说明,函数声明,函数指针定义等
volatile:说明变量在程序执行中可被隐含地改变,与const合称“cv特性“,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
3.标识符
标识符是用来标识变量、函数、或任何其他用户自定义项目的名称。一个标识符以字母A-Z或a-z或下划线_开始,后跟零个或多个字母、下划线和数字(0-9)。
- 第一个字符必须为字母或下划线。
- C标识符内不允许出现标点字符,比如@、%。
- C是区分大小写的编程语言。因此,在C中,Name和name是两个不同的标识符。
- 关键字不能作为常量名、变量名或其他标识符名称。
- 只能由字母、下划线和数字组成。
4.分号
在C程序中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。
5.空格
只包含空格的行,被称为空白行,可能带有注释,C编译器会完全忽略它。
在C中,空格用于表述空白符、制表符、换行符和注释。空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如int)在哪结束,下一个元素在哪里开始。
6.变量声明
在使用变量之前,需要先声明变量的类型和名称。
7.运算符
C语言支持常见的算术运算符(+、-、*、/、%)、赋值运算符(=)、比较运算符(<、>、==、!=等)、逻辑运算符(&&、||、!)等。
C语言数据类型
在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
C中的类型(函数返回值的类型)可以分为以下几种:
数组类型和结构类型统称为聚合类型。
基本类型:
(各种类型的存储大小与系统位数有关)
1.整数类型
2.浮点数类型
3.void类型
用于函数无返回值或无参数,指针指向void。