标识符->
字母、数字、下划线组成
第一个字符必须是字母和数字
无法使用关键字
无硬性规定标识符的长度,建议8字符以内
区分大小写
#define PI=3.1415926535897 /*此处为宏定义
#include <stdio.h> /*预编译处理
数据类型->基本类型->整型int->有符号基本整型int 4byte
->有符号短整型short/short int 2byte
->有符号长整型long/long int 4byte
->无符号基本整型unsigned int 4byte
->无符号短整型unsigned short (int) 2byte
->无符号长整型unsigned long (int) 4byte
->字符型char ‘ ’ “ ”(字符串)
->浮点数(实型)->单精度 float 4byte
->双精度 double 8byte
->长双精度 long double
->指针
->枚举-----------------------------------------?
->空NULL
->构造类型->数组
->结构体
->共用体
关于, exp:m=1,n=2;
a=(m+n,m-n) /a=-1 表达式=-1/
a=m+n,m-n /a=3 表达式=-1/
数据类型转换 float->double
char,short->int
unsigned short->unsigned int
强制类型转换 (double)(a+b)
关于++x和x++ ++x为先加再给表达式赋值 x++是献给表达式赋值再加
printf(格式控制符,输出表项)
格式控制符 %[-或0][m][.][n][l]格式符
-左对齐 0 右对齐
m 占用数据宽度
n n位小数
m.n共m列其中n位小数
l长整形或双精度
%%->%
scanf(格式控制字符串,地址表项)
if语句
if(a>0)
x=a+2;
else {
x=a-2;
}
switch语句
switch(语句序列1)
{
case 表达式1 : 语句序列1;
case 表达式2 : 语句序列2;
…
case 表达式n : 语句序列n;
default : 语句序列n+1;
}
条件运算符和条件表达式
表达式1 ? 表达式2 : 表达式3
goto语句和标号
L:表达式1;
goto L;
while循环语句
while(语句1)
表达式1;
注: 语句1的值为0
goto到循环结构之外的语句结束
return语句结束
break语句
do-while循环
do
{
语句1;
}
while (表达式1);
注: 表达式1的值为0
break语句结束
goto到循环结构之外的语句结束
return语句结束
for循环
for(表达式1;表达式2;表达式3)
语句1;
continue语句
continue ;
/*代表终止此次循环的执行,是否执行下一次循环依据循环条件判定/
二维数组的初始化
int a[2][3] = {{1,2,3},{4,5,6}};
int a[2][3] = {1,2,3,4,5,6};
int a[2][3] = {{1},{2,3}};
字符组常量
char a[5];
int a[5];
/二者等价,通过ASCII码转换/
字符串的输入和输出 /先调用#include<string.h>/
char c[]=“c is the best.”;
printf(“%s”,c);
puts() put(c);
gets() gets(c);
strcat() strcat(c,a);
strcpy() strcpy(str1,str2); /*把str2字符复制到str1*/
strcmp() strcmp (str1,str2); /*比较二者字符数,前>后正整数*/
strlen() stelen(c);
strlwr() strlwr(c); /*字符串李大写字母->小写*/
strupr() strupr(c); /*大写*/
函数
float sab(int n)
{
}
调用函数在定义函数前需要进行生命
void main()
{
float cube(float a);
cube(x);
}
二维数组作为函数形参的时候,可以不定义第一个参数(行数)但必须定义第二个参数(列)
数组作为参数调用的时候,实参应采用数组名。
#include<stdio.h>
int aver(int a[])
{
…
}
void main(){
aver(a,10);
return 0;
}
若使用全局变量前的函数体中使用了此变量,则需要在该函数体中进行外部声明
int cube(int a){
extern int x;
}
int x;
在同一个文件里,局部变量和全局变量重名时,局部变量的函数体中全局变量失效
在c中,用户可以使用的存储区分为三种
程序区->可执行程序的机器指令
静态存储区->固定的存储区域,比如全局变量
动态存储区->动态的存储区域,用于存储临时使用的局部变量,随取随释放,动态管理
形参
局部变量的三种使用方法
->自动型 auto int a;
->局部静态变量 static int a;
->寄存器变量 register int a;
注: 只有形参和局部自动变量可作为寄存器变量
只char int、指针变量可作为寄存器变量,float double long等超过寄存器长度
当寄存器已被占用满时自动分配为auto
全局变量的使用方法
->外部全局变量
大的工程中每个小文件的集合,需要调用不同的变量,用extern说明
注: extern不能初始化变量,只能说明变量
错误示范:extern int a=1;错误
正确示范:extern int a;
->静态全局变量
只在本文件中使用 static int a;
尽量不要使用static int a=1;(未被证实书中未提及)
函数的内部和外部
extern float cube(float a){
…
}
static float cube(float a){
…
}
编译预处理
#include<stdio.h> /*等效于
#include“stdio” */
#define
以上等等命令在文件开始执行时进行预处理用#来定义语句结尾不适用;
宏定义
#define PI 3.1315926(同时也可以是文本,进行文本替换)
注: 可以使用之前定义过的宏名进行重新定义
若代码中出现了“”中的字符与宏定义相同则在预编译处理中不进行定义
宏定义中若出现形参必须在形参两边加()
exp: #define MULTI(x) ((x)*(x))
int a=10,b=10;
int sun;
sun=MULTI(a+b)*10;
经过预编译,则
sun=((a+b)*(a+b))*10;
错误范例:#define MULTI(x) (x*x)
文件的包含
#include<….h>
#include”….h”
注:
<>是按照c语言编译器默认路径查询,””是先查当前路径再按默认路径查询
若file1.h中用到file.2 ,file2.h中用到file3.h,则必须把调用file3.h写在前面。
#include<file3.h>
#include<file2.h>
条件编译:用于只把源代码其中的一部分编译到目标程序中
if格式—> if 表达式
程序段1;
[#else
程序段2;]
#endif
ifdef格式-> ifdef 宏名
程序段1;
[#else
程序段2;]
#endif
/若已经被定义过该宏,则编译程序段1,若未定义过,则编译程序段2,若无else字段,则直接跳过#endif命令段/
定义指针
float *p;
赋值指针
p=m;
取地址运算
p=&m;
取内容运算
n=*p;
指针可以与整型数字加减,表示连续数据类型中的位置,同样是指针
两个同类型指针相减是表示两个指针之间的元素数(不算两边元素,开区间)
两个指针之间也可以使用不等号和等号
强制类型转换
(int*)指针; /p为指针/
指针被初始化时指向系统中的随机位置,所以要养成好习惯先把指针置成空指针
p=0;
p=NULL;
p=‘/0’;
以上三个表达式等价
字符串指针
char *p;
p=NULL;
*p=“C language”
p指向’C’的存储单元,该字符串在内存中是这样的
C language\0 /字符串最后一个字符后面的存储单元自动加’\0’/
/对于数组可以直接在定义时直接赋值,不可以在定以后对数组整体赋值,如
char s[2];
s[]=“CS”;
以上代码是错误的/
对于二维数组
int d[4][3];
d[0] d[1] d[2] d[3]分别为第一行等一维数组。
指针也可以作为数组
int *p[3][3];
指针与字符串数组
可以如此定义
char *f[]={“Clanguage”,”sjiajda”};
指向数组的指针变量
int (*p)[];
void通用指针
void main()
{
…
}