C语言总结

来源:互联网 发布:开发一个刷赞软件 编辑:程序博客网 时间:2024/06/11 02:10

1、标识符:字母、下划线、数字组成。字母或者下划线开头。区分大小写。关键字不是标识符。
标识符两个主要属性:类型和存储类。
类型有:基本类型(整形类型和浮点类型)、空类型(void)、枚举类型(enum)、派生类型(指针*、数组[]、结构体struct、共用体union、函数)。
存储类分为两类:自动存储类(auto、register)和静态存储类(static、extern)。
类型限定符:const的对象表明此对象的值不可以修改;声明为volatile的对象表明它具有与优化相关的特殊属性。
2、32个关键字:
类型:void signed unsigned char short int long float double enum struct union

存储类型:auto register static extern

类型限定符:const volatile

控制语句:if else switch case break default return while continue do for goto

其他:typedef sizeof
3、常量:直接常量和符号常量
直接常量
1)、整形常量:12U、0L、-3
十进制表示:除表示整数0外,不以0开头(以0开头的数字串会被解释成八进制数)。负数在前面加负号‘-’,后缀‘l’或‘L’表示长整型,‘u’或‘U’表示无符号数。例:345 31684 0 -23456 459L 356l 56789u 567LU
八进制表示:以数字0开头的一个连续数字序列,序列中只能有0-7这八个数字。例:045 -076 06745l 0177777u
十六进制表示:以0X或0x开头的连续数字和字母序列,序列中只能有0-9、A-F和 a-f这些数字和字母,字母a、b、c、d、e、f分别对应数字10、11、12、13、14、15,大小写均可。例:0x10 0X255 0xd4efL
2)实型常量:4.6、-1.23、1.2f
小数形式:必须有小数点
指数形式:以字母e或E后跟一个以10为底的幂数。字母e或E之前必须要有数字。字母e或E后面的指数必须为整数。字母e或E的前后及数字之间不得有空格。
默认是double,如果数字后面加上 就表示float 型,后缀“l”或“L”表示long double型。例:2.3e5 500e-2 .5E3 4.5e0 34.2 .5 12.56L 2.5E3L
3)字符常量:‘a’、‘b’ 等
4)字符串常量:”Hello!”
符号常量
1)const int MAX_SIZE =256;
2)#define MAX_SIZE 256
4、变量
1)、一个标识符就是一个变量
2)、变量的引用性声明(referncing declaration):不分配存储空间,变量可以有多次引用性声明。如:extern int a;
3)、变量的定义性声明(defining declaration):分配存储空间,变量有且只能有一次定义性声明。如:int a;
4)、全局变量和局部变量
a.当局部变量与全局变量重名时,函数将“看不见”全局变量
b.变量存储类型:auto(局部变量缺省类型),register,static,extern(全局变量缺省类型)
c.静态全局变量与普通全局变量在存储方式上完全相同,区别在于:非静态全局变量的作用域是整个源程序;而静态全局变量的作用域只是定义它的文件
5、标识符类型
1)、整型
int :-2^31 至 +2^31-1 即 -2147483648 至 +2147483647
unsigned int :0 至 2^32-1 即 0 至 4294967296
long :现在一般编译器都认为同 int
unsigned long :现在一般编译器都认为同 unsigned int
short :-2^15 至 +2^15-1 即 -32768 至 +32767
unsigned short :0 至 2^16-1 即 0 至 65535
long long : -2^63 至 +2^63-1 即 -9223372036854775808 至 +9223372036854775807 (gcc才支持)
_int64 : -2^63 至 +2^63-1 即 -9223372036854775808 至 +9223372036854775807 (VC/VS才支持)
2)、字符型:值所代表的字符见ASCII码表
char : -2^7 至 2^7-1 即 -128 至 127
unsigned char : 0 至 2^8 即 0 至 255
3)、单精度型浮点型
float : 32位,10^(-38) 至 10^(+38),7位有效数字
4)、双精度型浮点型
double : 64位,16位有效数字
5)、枚举类型
6)、数组类型
7)、结构体类型
8)、共用体类型
9)、指针类型
10)、空类型
11)、类型转换
a、自动类型转换
如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。
具体规定如下:
1.实型赋予整型,舍去小数部分。
2.整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分,小数部分值为0。
3.字符型赋予整型,由于字符型为一个字节,而整型为4个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。整型赋予字符型,只把低八位赋予字符量。
原则:把表示范围小的类型的值转换到表示范围大的类型的值
short int long float double
b、强制类型转换
形式:
(类型名)操作数
说明:
1.强制类型转换不会改变操作数自身的类型,只是得到一个所需类型的中间量
2.多用于自动类型转换不能实现的目的
3.强制类型转换后,会影响C语言做类型检查
举例:int a = 5, b = 2;float c = (float)a/b;
12)、ASCII码表

十进制 对应字符0      \0(转义字符)7      \a(转义字符:鸣铃)8      \b(转义字符:退格)9      \t(转义字符:横向跳到下一制表位置)10     \n(转义字符:换行)12     \f(转义字符:走纸换页)13     \r(转义字符:回车)32     空格34     \"(转义字符:输出")39     \'(转义字符:输出')48-57  0-965-90  A-Z92     \\(转义字符:输出\)97-122 a-z       \ddd(转义字符:1到3位八进制数所代表的字符)       \xhh(转义字符:1到2位十六进制数所代表的字符)

6、运算符:
算术运算符: + - * / % ++ –
赋值运算符: = += -= *= /= %= >>= <<= &= ^= |=
关系运算符: > >= < <= == !=
逻辑运算符: &&(短路运算符) ||(短路运算符) !
位运算符: << >> ~ | ^ &
条件运算符: ? :
逗号运算符: ,
指针运算符: * &
求字节数运算符: sizeof
强制类型转换运算符: (type)
分量运算符: . ->
下标运算符: []
其它运算符: ()
优先级
1 () [] . ->
2 ! ~ -(负号) ++ – &(取变量地址)* (type)(强制类型) sizeof
3 * / %
4 + -
5 >> <<
6 > >= < <=
7 == !=
8 &
9 ^
10 |
11 &&
12 ||
13 ?:
14 = += -= *= /= %= |= ^= &= >>= <<=
15 ,
结合性:2 13 14 是从右至左 其他都是 从左至右
7、控制语句

if (表达式1)    语句1;else if (表达式2)   语句2;else if (表达式3)   语句3;else     语句n;switch (表达式){     case 常量 1:          语句;          break;     case 常量 2:          语句;          break;     default:           语句;}a>b?a:b+1;while (表达式){    语句;}do{     语句;} while (表达式);for(表达式1; 表达式2; 表达式3){     语句;}break跳出switch语句,中断循环语句的执行continue中断本次循环的执行,进行下一次循环goto标签形式logo:

在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数。
8、数组
1)、数组初始化
int arr[10] = {10,9,8,7,6,5,4,3,2,1,0}; //错误!越界了
int arr[10] = {9,8,7,5}; //正确,后面的6个元素初始化0
int arr[] = {9,8,7}; //正确:元素个数为 3
int arr[]={}; //错误,到底是几个元素?
2)、C语言中,二维数组是按行存储的
int arr[2][] = { {1,2,3}, {4,5,6} };//错误,列不可省略
3)、数组元素的表示方法是:
数组名称[行][列]
对于m行n列的二维数组,a[0][0] 是数组的第一个元
素,a[m-1][n-1] 是最后一个元素
a表示第0行首地址,a+i表示第i行首地址
*(a+i),a[i],&a[i][0]表示第i行第0个元素地址
*(a+i)+j,a[i]+j,&a[i][j]表示第i行第j个元素地址
*(*(a+i)+j) ,*(a[i]+j),a[i][j]表示第i行第j个元素
4)、数组名是一个常量。
9、指针
1)、空指针是一个特殊的值,C语言为指针类型的变量专门定义一个空值,将空值赋值给一个指针变量以后,说明该指针变量的值不再是不定值,是一个有效的值,但是并不指向任何变量。空指针写作NULL,其数值为0。
2)、若指针已声明为指向某种类型数据的地址,则它不能用于存储其他类型数据的地址
3)、使用递增/递减运算符(++ 和 –)将指针递增或递减,一个类型为 T 的指针的移动,以 sizeof(T)为移动单位。
4)、数组作为形参,数组名不是常量而是一个指针。如:
void fun(int a[3][3])
{
printf(“sizeof(a) = %d\n”, sizeof(a));//输出4
}
void main()
{
int a[3][3];
printf(“sizeof(a) = %d\n”, sizeof(a));//输出36
fun(a);
}
10、文件操作
C语言支持两种类型的文件:文本文件和二进制文件。这两种文件的区别在于存放数据的方式不同。
二进制文件格式:以补码形式存放。二进制文件是把数据以二进制数的格式存放在文件中的,其占用存储空间较少。 数据按其内存中的存储形式原样存放。
文本文件:以ASCII码格式存放,一个字节存放一个字符。 文本文件的每一个字节存放一个ASCII码,代表一个字符。这便于对字符的逐个处理,但占用存储空间较多,而且要花费转换时间。
说明:
在UNIX系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统来处理二进制文件。
ANSI C 标准只采用缓冲文件系统来处理文本文件和二进制文件。
C语言中对文件的读写都是用库函数来实现。
1)、文件类型结构体FILE
缓冲文件系统为每个正使用的文件在内存开辟文件信息区。
文件信息用系统定义的名为FILE的结构体描述。
FILE定义在stdio.h中。
typedef struct
{
short level; /* 缓冲区满/空程度 */
unsigned flags; /* 文件状态标志 */
char fd; /* 文件描述符 */
unsigned char hold; /* 若无缓冲区不读取字符 */
short bsize; /* 缓冲区大小 */
unsigned char buffer; / 数据传送缓冲区位置 */
unsigned char curp; / 当前读写位置 */
unsigned istemp; /* 临时文件指示 */
short token; /* 用作无效检测 */
} FILE ; /* 结构体类型名 FILE */
2)、系统自动打开和关闭的五个标准设备文件:
文件号 文件指针 标准文件
0 stdin 标准输入(键盘)
1 stdout 标准输出(显示器)
2 stderr 标准错误(显示器)
3 stdaux 标准辅助(辅助设备端口)
4 stdprn 标准打印(打印机)
3)、文件打开方式
文本文件:t可以省略不写
rt 读取
wt 写入
at 追加
rt+读写
wt+写读
at+读追加
二进制文件
rb
wb
ab
rb+
wb+
ab+
4)、打开文件fopen
FILE *fopen(char *filename,char *mode)
功能:按指定方式打开文件。
返值:正常打开,为指向文件结构体的指针;打开失败,为NULL。
FILE *fp;
if(( fp=fopen(“c:\test”,“rb+”))==NULL)
{ printf(“cannot open this file\n”);
exit(0);
}
5)、函数ftell()
原型:long ftell(FILE *fp);
作用:得知目前的文件读写指针
返回值:目前读写指针所在的位置,当然错误时返回-1
6)、文件关闭fclose
函数首部:int fclose(FILE *fp)
功能:关闭fp指向的文件,释放文件结构体和文件指针。
返值:正常为0;出错为非0。
7)、文件读写函数
字符读写函数 :fgetc和fputc
字符输出fputc
函数原型:int fputc(int ch, FILE *fp)
功能:把一字符ch写入fp指向的文件中。
返值:正常,返回ch;出错,为EOF。

字符输入fgetc
函数原型:int fgetc(FILE *fp)
功能:从fp指向的文件中读取一个字符。
返值:正常,返回读取的字符;读到文件尾或出错时,为EOF。

格式化读写函数:fscanf和fprinf
函数首部:
int fscanf(FILE *fp, char *format, arg_list);
int fprintf(FILE *fp,const char *format, arg_list);
功能:按format格式对fp指向的文件进行I/O操作。
返值:成功,返回I/O的个数;出错或文件尾,返回EOF。

字符串读写函数:fgets和fputs
字符串输入 fgets
函数首部:
char *fgets(char *str,int length,FILE *fp);
功能:从fp所指向的文件中,至多读length-1个字符,送入字符数组str中, 如果在读入length-1个字符结束前遇换行符或 EOF,读入即结束,字符串读入后在最后加一个‘\0’字符。
返值:正常,返str指针;出错,返空指针NULL。

字符串输出 fputs
函数首部: int fputs(char *str,FILE *fp);
功能:把str指向的字符串写入fp指向的文件。
返值:正常,返0;出错返EOF。

数据块读写函数:fread和fwrite
字段输入fread /输出fwrite
函数首部:
int fread(void *buffer,int num_bytes, int count,FILE *fp);
int fwrite(void *buffer,int num_bytes, int count,FILE *fp);
功能:读/写数据块。
返值:成功,返回读/写的字段数;出错或文件结束,返回0。
说明:
buffer: 指向要输入/输出数据存储区的首地址的指针
num_bytes: 每个要读/写的字段的字节数
count: 要读/写的字段的个数
fp: 要读/写的文件指针
fread与fwrite 一般用于二进制文件的输入/输出。
8)、文件定位函数
用 法: int fseek(FILE *stream, long offset, int fromwhere);
描 述: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
返回值: 成功,返回0,否则返回-1。
fromwhere的值 SEEK_CURRENT(当前位置,0)、SEEK_SET(头,1)、SEEK_END(尾,2)

9)、rewind(fp);//fp指向文件首部
11、宏定义

#define  #undef  #ifdef  #ifndef#define MAX(a,b) (((a)>(b))?(a):(b))   括号要加上#define SQ(y) ((y)*(y))

12、文件包含

#include   “文件名”#include    <文件名>

13、条件编译

#if--#else--#elif--#endif

对于头文件,我们通常使用#ifndef–#define–#endif来防止头文件的重复包含。
14、其他宏定义
1)、defined操作符的一般形式如
defined macro-name
define与#ifdef:

#if defined MY

#ifdef MY

感叹号”!”来反转相应的条件

#if !defined DEBUG    printf(“Final Version!\n”);#endif

2)、操作符#通常称为字符串化的操作符

#include <stdio.h>#define mkstr(s) #sint main(void){   printf(mkstr(I like C));   return 0;}

3)、“##”可以把两个独立的字符串连接成一个字符串

#include<stdio.h>#define SORT(X)  (sort##X)void main(void){    int sort3 = 0;    printf("%s\n",SORT(3));}

4)、状态宏

__DATE__  进行预处理的日期(“Mmm dd yyyy”形式的字符串文字)__FILE__  代表当前源代码文件名的字符串文字__FUNCTION__ 代表当前源代码的函数名__LINE__ 代表当前源代码中的行号的整数常量__TIME__ 源文件编译时间,格式微“hh:mm:ss”

5)、其他

#line #error  #pragma