C程序
用C语言编写的程序称为C语言源程序,源程序文件的后缀名为“.c”。源程序经编译后生成后缀名为“.obj”的目标文件,再把目标文件与各种库函数连接起来,生成“.exe”可执行文件。C语言有三种基本结构:顺序结构、选择结构、循环结构。
mian函数
又称主函数,是C程序的入口。main后面跟一对小括号和一对花括号,花括号括起来的部分称为main函数的函数体。一个C程序从main函数开始执行,到main函数体执行完结束,而不论main函数在整个程序中的位置如何。每一个程序有且仅有一个mian函数,其他函数都是为main函数服务的。
头文件
程序中的注释
是对程序的说明,可出现在程序中任意合适的地方,注释从"/" 开始到最近一个 "/"结束,其间任何内容都不会被计算机执行,注释不可以嵌套。
C语言的风格主要有:C语言简洁、紧凑,使用方便、灵活;运算符丰富。
C语言的运算符包含的范围很广泛,共有34种运算;
数据结构丰富,具有现代化语言的各种数据结构;
用函数作为程序模块化实现C程序的模块化;
C语言允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作;
生成目标代码质量高,程序执行效率高;用C语言写的程序可移植性好。
常量与变量
常量是指在程序运行过程中,其值不能改变的量。常量分为整型常量、实型常量、字符常量、字符串常量、符号常量五种。在程序运行过程中其值可以改变的量称为变量。C语言中没有字符串变量,存放字符串使用字符数组。
基本类型
运算符的种类
需要两个运算单位,称为双目运算符。
:右端(低位)移出得二进制数舍弃,左端(高位)移入得二进制数分两种情况:对于无符号整数和正整数,高位补0;对于负整数,高位补1
强制类型转换
利用强制类型转换运算符可以将一个表达式的值转换成所需类型
【格式】(类型名)(表达式)
”类型名“称为强制类型转换运算符
赋值表达式
赋值运算符的符号为”=“,由赋值运算符组成的表达式称为赋值表达式。
算术表达式
算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(++),自减(–),一共7种;
加、减、乘、除可以使用整型和实型数据,而求余运算符,其运算对象只能是整型。除法运算符两边运算对象都为整型时,运算结果也为整型即舍掉小数部分。
关系表达式
关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)、不等于(!=),一共6种;
逻辑表达式
逻辑运算符:用于逻辑运算。包括逻辑与(&&)、逻辑或(||),非(!),共3种。
条件表达式
条件运算符:这是一个三目运算符,用于条件求值(? :);
逗号表达式
逗号运算符:用于把若干表达式组合成一个表达式(,);
表达式语句
运算对象加运算符构成表达式,表达式加分号构成表达式语句,运算对象可以是表达式、常量、变量。如赋值运算符加运算对象构成赋值表达式,赋值表达式加分号又可构成赋值语句。
空语句
空语句的一般形式为在一行上只有一个分号,如:
;
复合语句
把多个语句用括号{}括起来组成的一个语句称复合语句,如:
{
x=3;
y=5;
}
printf函数
【格式】printf(格式控制,输出列表);
格式控制:是用一对双引号括起来的,包含格式说明和原样信息
输出列表:是要输出的字符或变量名
scanf函数
【格式】scanf(格式控制,输出列表);
可以单独出现,也可以与else匹配出现,if语句可以嵌套,这是else总是离它最近的且没有与else匹配的if匹配
switch后小括号里面的表达式不能为实型,case后表达式不能有变量
break是终止所在整个循环,而continue是提前结束本轮循环,break语句可出现在循环结构与switch语句中,continue只出现在循环结构中
在一个循环体内又完整包含了另外一个循环,称为循环嵌套。
调用C语言标准库函数时要包含include命令,include命令行以#开头,后面是 “ ” 或 <> 括起来的后缀为“.h”的头文件。以#开头的一行编译预处理命令行,编译预处理不是C语言语句,不加分号,不占运行时间。
函数是具有一定功能的一个程序块。
【格式】函数的首部为:函数类型 函数名(类型1 形参1,类型2 形参2,…)
在函数定义中不可以在定义函数,即不能嵌套定义函数,函数类型默认为int型。
函数的返回值
【格式】return 表达式; / return(表达式);
表达式值得类型必须与函数首部所说明的类型一致,若类型不一致,则以函数值得类型为准,由系统自动进行转换
形式参数简称形参,是定义函数时函数名后面括号中得参数;
实在参数简称实参,是调用函数时函数名后面括号中的参数;
实参和形参分别占据不同的存储单元,实参向形参单向传递数值。
函数直接或间接地调用自己称为函数的递归调用。递归调用必须有一个明确的结束递归的条件。
在C语言中,除了主函数外,用户定义的函数都要遵循“先定义,后使用”的使用规则。凡是未在调用前定义的函数,C编译程序都默认函数的返回值为int类型;对于返回值为其他类型的函数,若把函数的定义放在调用之后,应该在调用之前对函数进行说明。
局部变量
【定义】是在函数内部或复合语句内部定义的变量
【作用域】只能在定义它的函数(或复合语句)中使用,离开了定义,它的函数(或复合语句)就不能使用
全局变量
【定义】在函数外部定义的变量,全局变量也称为外部变量
【作用域】从变量定义位置开始,到整个源文件结束为止
变量的存储类别
一、自动变量(auto):
自动变量是C程序中使用最多的一种变量,这种变量的建立和撤销都是在系统中自动进行的
二、寄存器变量(register):
寄存器变量与自动变量的性质相同,其区别只在于存储的位置不同,寄存器变量存储在CPU的寄存器中,而自动变量存储在内存的动态存储区,寄存器变量的存取速度要快些
三、静态变量(static):
静态类别变量的存储空间在程序的整个运行期间是固定的
静态变量的初始化在编译时进行,定义时可用常量或表达式进行显示初始化。对于没有初始化的静态变量,自动初始化为0(整型)或0.0(实型)
四、外部变量(extern):
extern使外部变量的作用范围扩大到其他源程序文件中
局部变量既可以说明为自动类别,也可以说明为静态类别;全局变量只能说明为静态类别
变量的作用域及生存期
一、局部变量的作用域及生存期
①自动变量的作用域及生存期
自动变量的存储单元被分配在内存的动态存储区,每当进函数体(或复合语句)时,系统自动为自动变量分配存储单元,退出时自动释放这些存储单元。自动变量的作用域为从定义位置起,到函数体(或复合语句)结束为止
自动变量在进入到定义它们的函数体(或复合语句)时生成,在退出所在的函数体(或复合语句)时消失,这就是自动变量的生存期
②寄存器的作用域及生存期
与自动变量相同
③静态存储类别的局部变量
在函数体(或复合语句)内部,用static说明的变量静态存储类别的局部变量,这种变量的作用域与自动(或寄存器)变量的作用于相同,但是生存期有所不同
静态局部变量的生存期将一直延长到程序运行结束
二、全局变量的作用域及生存期
全局变量的作用域为从变量定义的位置开始,到整个源程序文件结束为止。生存期为整个程序的运行期间,全局变量在整个程序运行期间都占用内存空间
①在同一编译单位内用extern标识符来扩展全局变量的作用域
在全局变量定义后,在引用函数前,应在引用它的函数中用extern对此全局变量进行说明,以便使编辑程序确定此外部变量已被定义,不必再为它分配存储单元,此时的作用域从extern说明开始,到此函数结束
注意:全局变量的定义只能出现一次,这时不可使用extern标识符。如果多次引用全局变量,这时必须用extern标识符
②在不同编译单位内用extern标识符来扩展全局变量的作用域
C语言的不同函数可以存放在不同的源程序文件中,每个源程序文件可以单独进行编译,进行语法检查,再生成目标文件,最后用系统提供的连接程序把多个目标文件连接成一个可执行程序。
当程序由多个源程序文件组成时,若每个文件中都要引用同一个全局变量,这时如在每个源程序文件中都定义一个所需的同名全局变量,将在连续时产生重复定义错误。解决的办法是在其中一个源程序文件中定义所有全局变量,而在其他用到全局变量的源程序文件中extern对这些变量进行说明,以表明它们已在其他编译单元中被定义
③静态全局变量
当用static标识符说明全局变量时,全局变量为静态全局变量。静态全局变量只能在定义它的源程序文件中使用,不能被其他源程序文件使用。
以#号开头的命令称为预处理命令。
无参宏定义
【格式】#define 宏名 字符串
#define 叫做宏定义命令,它也是C语言预处理命令的一种。所谓宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串。
有参宏定义
【格式】#define 宏名(参数表) 字符串
一个文件包含另一个文件的内容
【格式】#include “文件名” 或 #include <文件名>
编译时以包含处理以后的文件为编译单位,被包含的文件是源文件的一部分。
编译以后只得到一个目标文件.obj
被包含的文件又被称为“标题文件”或“头部文件”、“头文件”,并且常用.h作扩展名。
修改头文件后所有包含该文件的文件都要重新编译
头文件的内容除了函数原型和宏定义外,还可以有结构体定义,全局变量定义:
只要求缓冲文件系统(即高级磁盘I/O系统),对非标准缓冲文件系统(即低级磁盘I/O系统)不要求。