2021-05-26 C语言关键字全集

C语言关键字全集
在这里插入图片描述

1、Register 关键字
该关键字声明某个变量时,请求编译器尽可能将该变量存储在CPU内部的寄存器中而不是内存中,以提高速率。是尽可能,不是绝对的,因为寄存器的数量是有限的,只有这么几十个。

虽然寄存器的速度非常快,但是使用register 修饰符也有些限制的:register 变量必须是能被CPU 寄存器所接受的类型。意味着register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。而且register 变量可能不存放在内存中,所以不能用取址运算符“&”来获取register 变量的地址。

2、static
修饰变量:
第一个作用:修饰变量。变量又分为局部和全局变量,但它们都存在内存的静态区。静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern 声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。不能使用extern。
静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了。由于被static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。
修饰函数
第二个作用:修饰函数。函数前加static 使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
在这里插入图片描述
3、Short、int、long、char、float、double
short 为2个byte,int为4个byte,long为4个byte,float为4个byte,double为8个byte,char为1个byte

命名规则:
所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词。
一般来说习惯上用n,m,i,j,k 等表示int 类型的变量;c,ch 等表示字符类型变量;a 等表示数组;p 等表示指针。当然这仅仅是一般习惯,除了i,j,k 等可以用来表示循环变量外,别的字符变量名尽量不要使用。

4、signed、unsigned 关键字

signed int类型整数其值表示法范围为:- 2,31~2,31 -1
signed char 表示的字符型范围为:-- 2,7~2,7 -1
unsigned int类型整数其值表示法范围为:0~ 2,32 -1
unsigned char类型数其值表示的范围为 0~2,8 -1

5、case 关键字后面的值有什么要求吗?
case 后面只能是整型或字符型的常量或常量表达式

default:
break;

default: break;语句要添加。
把default 子句只用于检查真正的默认情况。
有时候,你只剩下了最后一种情况需要处理,于是就决定把这种情况用default 子句来处理。这样也许会让你偷懒少敲几个字符,但是这却很不明智。这样将失去case 语句的标号所提供的自说明功能,而且也丧失了使用default 子句处理错误情况的能力。所以,奉劝你不要偷懒,老老实实的把每一种情况都用case 语句来完成,而把真正的默认情况的处理交给default 子句。

6、break 与continue 的区别
break 关键字很重要,表示终止本层循环。现在这个例子只有一层循环,当代码执行到break 时,循环便终止。
如果把break 换成continue 会是什么样子呢?continue 表示终止本次(本轮)循环。当代码执行到continue 时,本轮循环终止,进入下一轮循环。
while(1)也有写成while(true) 或者while(1==1) 或者while((bool) 1)等形式的,效果一样。
do-while 循环:先执行do 后面的代码,然后再判断while 后面括号里的值,如果为真,循环开始;否则,循环不开始。其用法与while 循环没有区别,但相对较少用。
for 循环:for 循环可以很容易的控制循环次数,多用于事先知道循环次数的情况下。
循环语句的注意点
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数。
循环要尽可能的短,要使代码清晰,一目了然。
把循环嵌套控制在3 层以内。
在这里插入图片描述
7、goto 关键字
主张禁用

8、void关键字

(1) 对函数返回的限定;
(2) 对函数参数的限定。
void 的字面意思是“空类型”,void *则为“空类型指针”,void *可以指向任何类型的数据。

void 修饰函数返回值和参数
如果函数没有返回值,那么应声明为void 类型在C 语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void 类型。例如:

add ( int a, int b )
{
return a + b;
}

所以,无论在C 还是C++中,若函数不接受任何参数,一定要指明参数为void

如果函数的参数可以是任意类型指针,那么应声明其参数为void *

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

任何类型的指针都可以传入memcpy 和memset 中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。

9、return 关键字
return 用来终止一个函数并返回其后面跟着的值。
return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。

char * Func(void)
{
char str[30];return str;
}

str 属于局部变量,位于栈内存中,在Func 结束的时候被释放,所以返回str 将导致错误。

int *func(int *y1,int ch1)//该函数ok
{
    y1=&ch1;
    return y1;
}
int f1(int a,int b)//该函数ok
{
    return a+b;
}
int f3(void)//该函数也ok
{
   int a=188;
   int b=323;
   return a*b<<4;
}

总结:对于return返回值,不能返回局部变量的指针,局部变量的指针在执行完成该函数之后即释放了,返回则会出现错误。局部变量的整型变量或浮点变量则没有问题,因为该变量的内存还未覆盖则数据可以正常返回。

10、const关键字
const 修饰的只读变量,定义const 只读变量,具有不可变性。
const定义的只读变量放在静态存储区。
修饰一般变量
int const i=2; 或const int i=2;
修饰数组
int const a[5]={1, 2, 3, 4, 5};或
const int a[5]={1, 2, 3, 4, 5};
修饰指针
忽略类型名(编译器解析的时候也是忽略类型名),我们看const 离哪个近。“近水楼台先得月”,离谁近就修饰谁。
const int p; //const 修饰p,p 是指针,*p 是指针指向的对象,不可变
int const p; //const修饰p,p 是指针,*p 是指针指向的对象,不可变
int *const p; //const修饰p,p 不可变,p 指向的对象可变

11、volatile关键字
volatile 是易变的、不稳定的意思。

volatile int i=10;
int j = i;//(3)语句
int k = i;//(4)语句

意思就是volatile关键字告诉编译器i是一个可变的数值,每次读取需要从内存读取,不能优化代码间接读取i的值。
比如volatile可以用到定时器中断服务函数中的变量,其它文件需要引用这个变量则需要每次从内存读取,不能间接读取,因为这个变量是随时可变。

12、extern 关键字
文件外变量的引用声明;
不是本文件定义的,提示编译器遇到此变量和函数时在其他模块中寻找其定义

13、struct 关键字
空结构体多大?
结构体所占的内存大小是其成员所占内存之和。
空结构体的大小就定位1 个byte。
14、union关键字
union 空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。
如果一些数据不可能在同一时间同时被用到,则可以使用union。

typedef union {

unsigned int  data;
unsigned char gree_val[4];

}transform9;

大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

madata9.gree_val[0]=0x11;
madata9.gree_val[1]=0x22;
madata9.gree_val[2]=0x33;
madata9.gree_val[3]=0x44;
则madata9.data=0x44332211

我们一般使用小端模式。

15、枚举enum关键字
enum 变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依次加1,如果都没有赋值,它们的值从0 开始依次递增1。

typedef enum {
day1,
day2,
day3,
day4,
day5,
day6,
day7
}week;//这里的week 可以不用  但是也不能使用week.day1 是不合法啊

注意的是enum里的成员与结构体是不同的,使用的是“,” 而不是分号。默认day1为0,依次加1;

16、typedef关键字
typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非定义一个新的数据类型。

typedef struct student
{
  //code
}Stu_st;//       Stu_st  st1;  struct student st1;

typedef struct 
{
  //code
}Stu_st;//    Stu_st  st1;

struct student
{
  //code
}Stu_st;//     Stu_st  st1;  struct student st1;

以上三种定义均相同。

17、typedef 与#define 的区别

??????????
#define只是简单的替换过程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值