auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if while static
根据键字的作用,可以将关键字分为
数据类型关键字和流程控制关键字两大类。
| void | 声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果 |
|---|---|
| char | 字符型类型数据,属于整型数据的一种 |
| int | 整型数据,通常为编译器指定的机器字长 |
| float | 单精度浮点型数据,属于浮点数据的一种 |
| double | 双精度浮点型数据,属于浮点数据的一种 |
| short | 修饰int,短整型数据,可省略被修饰的int |
|---|---|
| long | 修饰int,长整形数据,可省略被修饰的int |
| signed | 修饰整型数据,有符号数据类型 |
| unsigned | 修饰整型数据,无符号数据类型 |
| struct | 结构体声明 |
|---|---|
| union | 共用体声明 |
| enum | 枚举声明 |
| typedef | 声明类型别名 |
| sizeof | 得到特定类型或特定类型变量的大小 |
| auto | 指定为自动变量,由编译器自动分配及释放。通常在栈上分配 |
|---|---|
| static | 指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部(单片机开发中,此变量值执行一次) |
| extern | 指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明 (在单片机开发中,声明的这个变量可以让多个文件访问到) |
| const | 与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变) |
| return | 用在函数体中,返回特定值(或者是void值,即不返回值) |
|---|---|
| continue | 结束当前循环,开始下一轮循环 |
| break | 跳出当前循环或switch结构 |
| goto | 无条件跳转语句 |
| if | 条件语句 |
|---|---|
| else | 条件语句否定分支(与if连用) |
| switch | 开关语句(多重分支语句) |
| case | 开关语句中的分支标记 |
| default | 开关语句中的“其他”分治,可选(一般条件都不符合,我们会走这个分支) |
| for | 循环结构 |
|---|---|
| while | 循环结构 |
| do | 循环结构 |
| typedef | 给数据类型取别名 |
|---|---|
| sizeof | 计算对象所占内存空间大小 |
unsigned :无符号的
unsigned char var; //var的范围:0~255
signed :有符号的(可以省略不写)
signed char var; //var的范围:-128~127
字符型
int :整型
int var;
float :浮点型
float var;
double :双精度型
double var;
short :短整型
short var;
long :长整型
long var;
void :空型
void function(void);
| 类型/编译器 | 16位编译器 | 32编译器 | 64编译器 |
|---|---|---|---|
| void | 0 | 0 | 0 |
| char | 1 | 1 | 1 |
| char * | 4 | 4 | 8 |
| short int | 2 | 2 | 2 |
| int | 4 | 4 | 4 |
| float | 4 | 4 | 4 |
| double | 8 | 8 | 8 |
| long | 4 | 4 | 8 |
| long double | 12 | 12 | 16 |
| long long | 8 | 8 | 8 |
一般来说习惯上用n,m,i,j,k 等表示int 类型的变量;c,ch 等表示字符类型变量;a 等表示数组;p 等表示指针。当然这仅仅是一般习惯,除了i,j,k 等可以用来表示循环变量外,别的字符变量名尽量不要使用。
struct stu{
char sex;
int age;
float score;
struct stu *Next;
};
struct stu var;
union non{
char sex;
int age;
float score;
};
union non var;
struct用法与union一样,两者不同的是结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
一般union用的不多
enum em
{a = 23,b,c,d = 56,e}; //其中b=24,c=25,e=57
enum em var;
auto :自动的(可省略不写)
auto char var;
static :静态的
static char var;
static void function();
注意:声明的变量和函数必须是全局的,如果只用在函数内部会报错
extern :外部的
extern char var;
extern void function();
register :寄存器的
register long i = 30000;
const :声明只读变量
const char var = 100;
char arr[var]; //试图声明一个长度为100的字符型数组
//在MDK (ARM)中可以使用常变量来声明数组的长度
//在VC++编译环境中也可以。
//在C51-keil中不可以使用常变量来声明数组的长度
char *const p;
//指针变量p不可改变,但是它指向的地址里面的值可变
char const *p; 或 const char *p;
//指针变量p可以改变,但是它所指向的地址里面的值不能改变
const char * const p; //p地址不可改变,里面的值也不能变
volatile :随时会改变的
//为了保证程序不被优化,保证CPU取到的数据是最新的
//(即提醒CPU每次都必须到内存中取出变量当前的值而不
//是取cache或者寄存器中的备份),使用该关键字修饰,如:
int *p; *p = 1; *p = 2;
//编译时,编译器会对上面的语句进行优化,
//会直接优化成:
int *p; *p = 2;
//为了保证上面的语句不被优化,加volatile修饰变量:
int * volatile p;
if -else if -else if … else
if(表达式1)
{语句s;}
else if(表达式2)
{语句s;}
else if(表达式3)
{语句s;}
else
{语句s;}
switch(变量)
{
case 常量1:语句;...;break;
case 常量2:语句;...;break;
case 常量3:语句;...;break;
default:语句;
}
unsigned char i = 6;
unsigned char dat;
switch(i)
{
case 3:dat = 5;break;
case 5:dat = 34;break;
case 6:dat = 99;break;
case 7:dat = 56;break;
case 6:dat = 100;break;
default:dat = 68; //默认执行
}
注:如果少了break,则顺序判断i的值与case后面的常量是否相等,如果相等,则执行其后面的语句,以后不再判断,再继续执行下面的每一条case 后面的语句,直到default。
for(语句1;语句2;语句3)
{
语句4;
语句...;
}
for(int i =0;i<5;i++)
{
}
while(表达式)
{
语句;
....;
}
如何来设计一个死循环?两种方法:
for(;;)
while(1)
do{
语句1;
...;
}while(表达式);
for(i=10;i>0;i--)
{
t = 10;
while(t--)
{
dat++;
if(dat == 3)
break;//跳出while()结构。
}
}
char buf = 10;
while(buf--)
{
a++;
b++;
continue;//遇到continue则结束这次循环
d++; //这条永远都不会执行到
e++; //这条永远都不会执行到
}
unsigned char dat=10;
while(dat--)
{
a++;
b++;
Lable: c++;
if(c == 3)
goto Lable;//直接跳到Lable标号去
d++;
}
void function()
{
char a,b;
a++;
return; //遇到return即返回调用处
b++; //不会被执行
return; //不会被执行
}
typedef : 类型重定义
typedef与宏定义define的区别:
| typedef | define |
|---|---|
| typedef 是在编译阶段进行定义 | 宏定义是在预编译处理阶段完成展开 |
| typedef 是类型重新定义,不是简单地替换 | 宏定义只是简单的替换,没有定义 |
//1.用uchar重新定义unsigned char
typedef unsigned char uchar;
//2.用uchar 替换unsigned char
#define uchar unsigned char
typedef unsigned char* M;
#define M unsigned char*
M p1,p2;
//对于typedef来说:p1是指针变量,p2也是
//对于宏定义来说:p1是指针变量,p2是普通变量
sizeof:用来求类型所占的字节数
int var = 10;
char g;
g = sizeof(var++);//g = 4;
//注意:var++该条语句没有被执行!
//()里的语句是不会被执行的。