一、c语言的词法符号:
1、关键字(32个)
存储类型(4):auto、static、extern、register
auto:c语言默认的存储类型;
static:静态存储类型
extern:当外部文件需要使用时用extern声明
register:将变量由内存调入寄存器中,不用每次访问都进入内存,提升效率
注:这里说到static,顺便写一下对局部、全局变量,静态与非静态变量的理解
普通局部变量:作用域函数内部,生命周期是函数执行一次的时间。
静态局部变量:作用域函数内部,生命周期是整个程序执行的时间。
普通全局变量:作用域整个程序所有语句,生命周期整个程序执行时间。
静态全局变量:作用域是自身源文件内部,生命周期是整个程序执行时间
这里简单类比一下:
普通局部变量像是你家买的一次性纸杯,只给你自己家里人用,用一次就回收,再用下一只纸杯。
静态局部变量像是你家买的正常的杯子,也是只有你自己家用,但可以一直用,每次用都是那一个
普通全局变量像是公共停车位,你可以来他也可以来
静态全局变量像是小区内部停车位,只给小区内部的居民使用
数据类型(8):char(1字节)、short(2字节)、int(4字节)、long、float(4字节)、double(8字节)、signed、unsigned
数据类型不在过多赘述,这些应该没什么问题
注:double:有效数据15~16位
float : 有效数据6~7位
选择结构(5)if 、else、 switch、case、default
这里说一下if else,那三个留到后面说
if(判断条件){ 语句块;}else{ 语句块;}if(判断条件){ 语句块;}else{ 语句块;}
主要用于判断条件成立执行if内部语句块,不成立执行else内部语句块,还可以写成这种形式
if(判断条件){ 语句块;}else if(判断条件){ 语句块;}else{ 语句块;}
需要多种情况判断时else if可以写多个,不需要时也可以只写if,其他可省略(包括else)
循环结构(6)while、for、do、break、continue、goto(几乎不怎么用到)
先说说while循环:while(判断条件){ 语句块;}
当判断条件为真时一直重复执行语句块,知道判断条件为假退出循环,如果一开始while中判断条
件就为假那直接结束循环,但有时我们还想先执行一次循环在判断怎么办?这就靠
do{语句块;}while(判断条件); 循环了,它会先执行语句块,在进行判断。
再说说for循环
for(1初始化;2测试条件;3更新){4语句块;} 执行顺序应该是 12 432 432 432知道不满足测
试条件结束循环
再来说说break和continue
break是退出循环的意思,continue则是退出当前循环,假设用for进行循环5次,执行第一次循环时遇到break,直接退出for循环,for循环就结束了,不会再执行2、3、4、5次了,而continue则只是跳出这一次循环,执行第二次循环
这时就可以说说switch那三个关键字了,它们和break通常一起使用
通常是swtich(整型表达式){case 常量1:语句;break;case 常量2:语句;break;.....以此类推;default:语句;break;}
举个例子:
#include<stido.h>
int main(void){
int id=0;
printf("请输入代表id号\n");
scanf("%d",&id);
switch(id){
case 0: printf("小红\n");break;//输入0输出小红
case 1: printf("小李\n");break;//输入1输出小李
default: printf("没有此人\n");break;//输入其他数字输出没有此人
}
return 0;
}
//注:如果不写所有的break;输入1的话会输出小李和没有此人,从case1开始向下执行
用来列举多种情况,每一种情况发生执行它相应的语句,然后break;如果没有break则会在发生情况的语句块依次向下执行,default用来处理没有列举的情况;
其他变量(6)void、typedef、volatile、const、sizeof、return
void也叫无类型,不同于char按一个字节访问,int是按四个字节访问,也可以把void申请的变量看成只申请不访问
typedef是重命名,例如typedef int pin_t;那么pin_t将相当于int使用了
volatile是易变的意思,修饰变量是要求每次读取变量时都从寄存器去读取,不要编译器进行优化,一般用在多线程共享变量的时候。
const关键字代表的是可读的意思,变量被修饰后不能被修改,只可读
例如const int a=5;修饰后a不能再被赋值成其他值,但可以改变a的地址来改变变量的值
但如果const修饰地址时,那地址不能改变,但是值可以改变
sizeof关键字主要是用来得到类型的大小,sizeof(int),因为int是四个字节,所以得到的是4;
return就是结束当前函数并返回一个值,如果后面不接任何东西,那将会返回一个随机值
构造类型(3)struct(结构体)、union(联合)、enum(枚举)
这三个更像是构造了新的数据类型
struct(结构体)类型存储区里可以包换多个类型的存储区
结构是:struct 结构体名{成员变量;}
例如
struct person{int age; float height; char name[10]; };
struct person per;//per就相当于一个新类型,里面包含一个int类型,一个float类型,一个char类型数组;访问这些成员变量只需要 per.age,per.height,per.name[],即和正常的变量与数组一样使用,但由于申请结构体变量时每次都要带着struct person过于繁琐,还可以用typedef进行重命名
typedef struct person{
int age;
float height;
char name[20];
}p_t
//struct persong per;
p_t per={30,1.85f,"peng");//重命名后和上面申请结构体变量是一个意思,并初始化结构体
union创建一个联合体类型,也叫共用体,实际上就是他里面的所有成员变量共用一块地址,以前往往是为了节省空间使用,但由于现在计算机的内存已经不是问题了,它使用的频率也越来越少了,下面提供一个使用union来看大端小端的方法
所谓大端实际上就是高字节存在低地址,小端是低字节存在高地址;
typedef union{
short a;
char b;
}u_t;
int main(void){
u_t u;
u.a=0x0001;
(u.c)?printf("small\n"):printf("big\n");
return 0;
}
由于这两个成员共用一个地址
enum是枚举,也可以创建新的数据类型,就是整数类型存储区,数字范围有限,使用enum声明枚举,计算机会给每个成员变量分配一个对应整数,默认从0开始多个连续非负整数,称为枚举值,可以当做整数使用,也可以给成员变量加缺省值,如下
enum season{CHUN,XIA,QIU,DONG};
这时CHUN是0,XIA是1,以此类推
但是如果
enum season{CHUN,XIA=5,QIU,DONG};
这时CHUN是0,XIA是5,QIU是6,DONG是7