修饰局部变量
//代码1
#include
void test()
{
int i = 0;
i++;
printf("%d ", i);
}饰全局变量
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
//代码2
#include
void test()
{
//static修饰局部变量
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
//代码1
//add.c
int g_val = 2018;
//test.c
int main()
对比代码1和代码2的效果理解static修饰局部变量的意义。
static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,
生命周期才结束
修饰全局变量
//代码1
//add.c
int g_val = 2018;
//test.c
int main()
{
代码1正常,代码2在编译的时候会出现连接性错误。
结论:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,
不能在其他源文件内使用。
修饰函数
代码1正常,代码2在编译的时候会出现连接性错误.
结论:
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
#define 定义常量和宏
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include
int main()
{
int sum = ADD(2, 3);
printf("sum = %dn", sum);
sum = 10*ADD(2, 3);
printf("sum = %dn", sum);
return 0;
}
常见关键字:
int 声明整型变量
double 声明双精度变量
long 声明长整型变量
char 声明字符型变量
float 声明浮点型变量
short 声明短整型变量
signed 声明有符号类型变量
unsigned 声明无符号类型变量
struct 声明结构体变量
union 声明联合数据类型
enum 声明枚举类型
switch 用于开关语句
case 开关语句分支
default 开关语句中的“其他”分支
break 跳出当前循环
continue 结束当前循环,开始下一轮循环
do 循环语句的循环体
while 循环语句的循环条件
if 条件语句
else 条件语句否定分支(与if连用)
for 一种循环语句(可意会不可言传)
return 子程序返回语句(可以带参数,也可不带参数)
void 声明函数无返回值或无参数,声明空类型指针
重要关键字:
auto 声明自动变量,缺省时编译器一般默认为auto
register 声明寄存器变量,告诉编译器将变量尽可能存在寄存器上(但也不是绝对的,如果当寄存器已经存满了,则它不会起任何作用。
虽然寄存器的速度非常快,使用register 修饰符也有些限制的:register 变量必须是 能被CPU 寄存器所接受的类型。意味着register 变量必须是一个单个的值,并且其长度应小 于或等于整型的长度。而且register 变量可能不存放在内存中,所以不能用取址运算符“&” 来获取register 变量的地址 )
static 声明静态变量,(第一:限制函数的作用域,使得函数只作用于本文件。第二,修饰变量,使得变量存储在静态区,只有程序结束时,变量才被销毁)
const 声明只读变量(编译器认为被const修饰的变量是不能被修改的,所以是个常量,因此存在寄存器上,每次都从寄存器上读取)
volatile 说明变量在程序执行中可被隐含地改变(使编译器在内存中读取变量的值)
typedef 用以给数据类型取别名(当然还有其他作用)
extern 声明变量是在其他文件正声明(也可以看做是引用变量)
goto 无条件跳转语句
sizeof 计算对象所占内存空间大小