运算符优先级
- 自右向左记忆口诀
- 条件赋值自增减(?: =/+=/-= ++ -- )
- 指针取址按位反 (* & ~)
- 内存非负强制转 (sizeof ! - (type))
- define 前面的#标志着define是一个【预处理命令】而不是C语句。
- 高字节在【高地址】存储单元,低字节在【低地址】存储单元。
- 16位的内存中-65537与-1在内存中的值是一样的。
- 16位的内存中-65535与1在内存中的值是一样的。
- 整型常量后可加字母L或l表示long int型常量,如123L, 45l, 0XAFL.
- U或u表示无符号数
- float占4个字节 double占8个字节 long double 占10个(TC/BC)或8个(VC)字节
- 【转义字符】r光标到当前行首、t制表符、b退格、v竖向跳格、a鸣铃
- ++和--不可用于常量和表达式
- <<和>>表示位移运算符,左移值乘2,右移值除2。
- C语言常量分为直接常量和符号常量,定义符号常量需要使用预处理命令#include。
- 不合法的浮点数[e3],[2e4.3],[.e5],[-e3]
格式化输出
- 两个scanf函数调用之间通常需要使用【fflush库函数】清除键盘缓冲区字符
- 除了X,E,G 其他格式转换符均为小写字母
整型
- 有符号整型输出 --- %[-/+][0][宽度][.至少输出位数][l/h][u/o/x/X]
- 无符号整型输出 %[-/+][#][0][宽度][.至少输出位数][l/h][u/o/x/X]
- - 表示左对齐
- + 表示有正号显示正号
- 0 表示空格补0
- # 表示16进制数要输出0x或0X,八进制数要输出0
- %hd表示输出短整型,%o输出八进制,%x或%X输出十六进制
int a = 123;
print("a=%06dn", a); // a=000123;
print("a=%+06dn", a); // a=+00123;
print("a=%-06dn", a); // a=123;
print("a=%6dn", a); // a=□□□123;
print("a=%+6dn", a); // a=□□+123;
print("a=%-6dn", a); // a=123;
print("a=%6.4dn", a); // a=□□0123;
print("a=%-6.5dn", a); // a=00123;
浮点型
- 实数输出 %[-/+][#][0][宽度][.precision][l/L][f/e/E/g/G]
- %f 表示小数点后要输出六位,不够补0
- %g 不输出无意义的0
- %e 指数形式输出
- #表示必须输出小数点
- [.precision]输出小数部分的位数(要四舍五入)
字符的输入输出
- %.3s输出字符串前3个字符
- getchar:读取键盘输入一个字符,回车键结束,回显
- getc:读入流文件一个字符,回车键结束,回显
- getche:读取键盘输入一个字符,任意键结束,回显
- getch:读取键盘输入一个字符,任意键结束,不回显
- putchar:输出一个字符
- putc:输出一个字符到流文件
- puts:输出字符串(自动换行)
一些错误的用法
scanf("%d5.2f",&f); //输入浮点数不可规定精度
scanf("%d",&(a+b)); //表达式没有地址,不能用取地址符
选择结构
switch-case语句注意事项
switch(A); //A可以是int、char或者枚举,不可为浮点数
case 1:{b=b+1; break;} // {}可加可不加
case x: //错误❌,case后面不可为变量
case; // 错误❌,case后面直接跟分号是错误的
switch a // 错误,switch后面的括号不可省略
/*swith语句可以嵌套*/
- C语言语句可分为表达式语句、复合语句、函数调用语句、空语句、控制语句。
- 逻辑运算符两侧的运算对象数据类型可以是任何类型的数据。
数组
一维数组
- 数组名不可被赋值
- memset的使用---实现对某内存块各字节单元整体赋同样的值
- memcpy的使用---实现两个数组间的赋值
// 每个数据单元的值为‘a’
char str[10];
memset(str,'a',10);
// 每个数据单元的值清0
int a[10];
memset(a,0,10*sizeof(int));
//[思考题]下面程序执行后数组a的各元素值是多少?
short a[10];
memset(a,2,10*sizeof(short));//值为514【00000010 00000010】// memcpy的用法
memcpy(b,a,5*sizeof(int));
二维数组
- 二维数组的赋值
// 数组元素的整体赋值
int a[2][3] = {{1,2,3},{1,2,3}}; //{1,2,3,1,2,3}
// 数组元素的整体赋值
int a[2][3] = {1,2,3,1,2,3}; //{1,2,3,1,2,3}
// 数组元素的部分赋值
int a[2][3] = {{1},{3}; //{1,0,0,1,0,0}
// 数组元素的部分赋值
int a[2][3] = {1,2,3}; //{1,2,3,0,0,0}
// 数组元素的部分赋值,省略一维
int a[][3] = {{1,2},{4}} //{1,2,0,4,0,0}
// 数组元素的部分赋值,省略一维
int a[][3] = {{1,2,3,4} //{1,2,3,4,0,0}
函数
填空题
- 当函数返回值缺省时,函数的返回值类型为【int】
- 静态局部变量若在定义是未赋初值,则系统赋初值为【0】,其生存周期是【整个源程序】,其作用域是【在该变量的函数内或复合语句中】。
- 形参只能是【变量】。
- C语言中,函数的隐含存储类别是【extern】。
四种变量的存储类型
- 动态存储类型:auto, register
- 静态存储类型:extern, static
- auto 只能在函数内或符合语句中定义(局部变量)
- register 只有局部变量和形式参数可以定义
- extern是函数的隐含存储类别
指针
表示a[i][j]的几种形式
a[i][j]
*(a[i]+j)
*(*(a+i)+j)
(*(a+i))[j]
数组指针
int (*p)[4];
// 表示指向含有4个int型元素的一维数组指针
// 可用来表示二维数组的行指针// 利用p访问数组元素的四种形式
p[i][j]
*(p[i]+j)
*(*(p+i)+j)
(*(p+i))[j]
动态内存分配
- malloc() 分配若干个字节的内存空间
- calloc() 分配若干个连续的存储空间
- realloc() 改变原来分配的存储空间大小
int *p = (int*) malloc( 4 *sizeof(int));
int *p = (int*) calloc( 4, sizeof(int))int *p = (int*) malloc( 4 *sizeof(int));
p = (int*) realloc(6 *sizeof(int));
指针函数---- 函数类型 *函数名(形参1,形参2,...)
- 【注意】如果函数返回一个指针,不能返回auto型的局部变量地址,但可以返回static型的局部变量地址
函数指针---- 函数类型 (*指针变量)(形参1,形参2,...)
结构体与共用体
间接定义法
struct 结构体类型名
{数据类型名 成员名
};
// 结构体的变量的定义
struct 结构类型名 变量列表名;
// 可定义多个结构类型变量
struct students_info stu1, stu2;
// 可定义指向结构体类型的指针变量
struct students_info *p;
直接定义法
struct 结构体类型名
{数据类型名 成员名
}变量名列表;
结构体类型不分配内存,结构体变量分配内存;结构体类型不能被赋值、存取和运算,结构体变量可以。
结构体变量的引用
// 非指针类型
结构体变量名.成员名
// 指针变量类型
结构体指针->成员名
(*结构体指针).成员名
文件
文件的打开与关闭
- fopen 发生错误时,函数的返回值是【0(NULL)】打开成功返回【文件结构体指针】
- fcolse正常关闭文件是,返回值是【0】,否则是【非0】。
- feof() 遇到文件尾返回【真(非零值)】,否则返回【假(0)】
打开文件的方式
- r 只读
- w 创建新文件,只写
- a 打开已有文件,在末尾追加,只写(若文件不存在,创建新文件,只写)
- r+ 打开已有文件,可读写
- w+ 创建新文件,可读写(若已有,则覆盖)
- a+ 可读写,其余同a
- t 打开文本文件
- b 打开二进制文件
文件的读写
- 字符读写函数:【fget】和【fputc】。
- 字符串读写函数:【fgets】和【fputs】。
char str[] = "123456789";
fputs(str, fp);
fgets(str, 8, fp);
- 数据块读写函数:【fread】和【fwrite】一般用于二进制文件的输入和输出
fread(指针,数据项的大小,移动的n个数据项的字节,文件指针)
fread(a, sizeof(short),10, fp); // 从文件中读10个整型数据到数组a
- 格式化读写函数【fscanf】和【fprintf】一般用于文本文件的输入和输出
int fscanf (文件指针, 格式字符串,输入列表);
fscanf(fp, "%d,%d",&i,&t);
int fprintf (文件指针, 格式字符串,输入列表);
fprintf(fp, "%d,%d",i, t);
文件的定位读写
- rewind:将指针指向文件开头
- fseek: 将指针指向特定的位置
- SEEK_SET 0 文件开始处
- SEEK_CUR 1 文件当前处
- SEEK_END 2 文件末位处
int fseek(文件指针,位移量,起始点);
fseek (fp, 2*sizeof(int),SEEK_SET);
- ftell: 将指针指向当前处