1.关键字

目录

基础

声明和定义的区别

auto

register

使用register的注意点

static

修饰变量

全局变量

局部变量

修饰函数

基本数据类型

sizeof

unsigned、signed

if、else

bool变量与零值比较

指针变量与零值比较

注意事项

switch、case

case后面关键字后面有什么要求?

do、while、for

break和continue的区别

循环语句注意点

for循环建议

goto

void

return

return不可返回栈内存的指针

const

修饰只读变量

节省空间,避免不必要的内存分配,同时提高效率

修饰变量

修饰数组

修饰指针

修饰函数参数

修饰函数的返回值

volatile

extern

struct

空结构体

柔性数组

union

大小端模式

enum

枚举和define的区别

typedef


基础

C语言标准定义有32个关键字

auto 生声明自动变量,缺省时编译器一般默认为auto

int 声明整型变量

double 声明双精度变量

long 声明长整型变量

char 声明字符型变量

float 声明浮点型变量

short 声明短整型变量

signed 声明有符号类型变量

unsigned 声明无符号类型变量

struct 声明结构体变量

union 声明联合数据类型

enum 声明枚举类型

static 声明静态变量

switch 用于开关语句

case 开关语句分支

default 开关语句中的“其他”分支

break 跳出当前循环

register 声明寄存器变量

const 声明只读变量

volatile 说明变量在程序执行中可被隐含的改变

typedef 用以给数据类型取别名

extern 声明变量是在其他文件中声明(也可以看做是引用变量)

return 子程序返回语句(可以带参数,也可以不带参数)

void 声明函数无返回值或无参数,声明空类型指针

continue 结束当前循环,开始下一轮循环

do 循环语句的循环体

while 循环语句的循环条件

if 条件语句

else 条件语句否定分支(与if连用)

for 一种循环语句

goto 无条件跳转语句

sizeof 计算对象所占内存空间大小


声明和定义的区别

示例

A) int i;

B) extern int i;

定义就是创建一个对象,为这个对象分配一块内存并且给它取一个名字,这就是变量名或者对象名;一个对象在一定的区域内只能被定义一次,如果定义多次,编译器会提示你重复定义。

声明有两种含义

1.告诉编译器,这个名字已经匹配到了一块内存,下面代码用到变量或者对象是在别的地方定义的;声明可以出现多次。

2.告诉编译器,这个名字我已经预定了,别的地方不能用他来作为变量或者对象名;就像图书馆占位一样。

声明典型的例子就是函数声明:void func(void);

总结:

定义是创建了一个对象,并为这个对象分配了内存,声明只是声明有这个变量或者对象,并没分配内存。

 

auto

编译器默认情况下,变量就是auto

register

请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。

寄存器的存取速度比内存块,内存硬盘都使用寄存器,那你就是钱太多了。

使用register的注意点

register变量必须是能被CPU寄存器所接受的类型,意味着register变量必须是一个单个的值,并且其长度应小于或等于整形的长度;register变量不能放在内存中,所以不能用取址预算符"&"来获取register变量的地址。

static

修饰变量

都存在内存的静态区

全局变量

作用于仅限于变量定义的文件中,其他文件即使使用extern也没有办法使用它。

准确的说,作用域是从它定义的地方到文件末尾。

局部变量

变量在函数中,函数运行结束时,变量的值不会被销毁,所以下次使用的维持上一次的值。

修饰函数

指定函数在本文件中有效,防止与别人定义的函数重名。

基本数据类型

 

在32位系统中:(一般来说,不同平台有差异)

char1byte
short2byte
int4byte
long4byte
floate4byte
double8byte

     

 

 

 

 

 

 

sizeof

不是函数,是一个关键字;计算对象所占内存空间大小

示例:

int i;

A)sizeof(i);    B)sizeof(int);     C)sizeof   i;     D)sizeof    int;

32位系统结果都是4,说明sizeof是关键字而不是函数。

unsigned、signed

计算机底层只认识0、1,那负数怎么存储?

把基本数据的最高位腾出来,用来存符号,同时约定如下,如果最高位是1,表明这个数是负数其值为除最高位以外的剩余位的值添加上这个负号;如果最高位是0,表明这个数是正数其值为除最高位以外的剩余位的值;

这个的话取值范围如下:

singed  char-2^7~2^7-1-128~127
unsigned char0~2^8-10-256-1
signed short-2^15~2^15-1-32768~32767
unsigned short0-2^16-10-65536-1
singed  int-2^31~2^31-1-2147483648~2147483647
unsigned int0-2^32-10~4294967295

 

 

 

 

 

 

 

默认情况都是singed

解释:

符号的char占一个字节,最高位表示正负,其余的七位表示数值,七位二进制可以表示128个数(2^7 = 128),即0~127;加上符号位后,就变成了-127 ~ -0,0 ~127,这时,就会出现‘-0’这样一朵奇葩;

我对网上关于-0和-128原码相同的这种说法表示很无语;

我们知道,计算机是以补码的形式存数据的

-0和-128在计算机中是怎样存的?

所以,-128和-0的原码是不一样的;

但是,我们的char类型是8位,它把-128最高位符号位截掉了,这样-128的原码就变成了1000 0000;

被截短的-128的原码才和-0的原码相等;

既然都说到这里了,终于可以不提‘-0’这个恶心的东西了,今后看到一个有符号的char,它的原码用二进制表示为1000 0000的时候,我们就把它当做-128就可以了(只是看做,-128的原码可不是1000 0000);

#include <stdio.h>
int main()
{
    char a[1000];
    int i = 0;
    
    for(i = 0; i < 1000; i++)
    {
        a[i] = -1-i;
    }
    
    printf("strlen(a):%d\n", strlen(a));//255
    
    return 0;
}

 

if、else

bool变量与零值比较

bool   bTestFlag = FLASE;

if(bTestFlag  == TRUE);

if(bTestFlag  == TRUE);

float变量与零值比较

float  fTestVal = 0.0;

#define EPSINON 0.00000000001;

if((fTestVal >= -EPSINON) && (fTestVal <= EPSINON));

指针变量与零值比较

int* p = NULL;

if(p == NULL);

if(p != NULL);

注意事项

if后面是否需要跟分号

先处理正常情况,在处理异常情况。

switch、case

注意:

每个case后面都要加上break,在最后必须使用default分支;

case后面关键字后面有什么要求?

整形或字符型常量或者常量表达式

do、while、for

C语言中的三种循环语句:while循环、do_while循环、for循环

break和continue的区别

break表示终止本层循环,continue表示终止本次或者本轮循环

循环语句注意点

最长的循环放在内层,最短的循环放在外层,以减少CPU跨层循环层的次数

for循环建议

for循环建议使用半开半闭区间写法,这样更加直观

不能再循环内修改循环变量的值

循环要尽可能短,要使代码清晰,一目了然。

循环控制在三层以内

goto

禁用goto关键字

void

色即是空,空即是色

void不能代表一个真实的变量

return

终止一个函数,并返回其后跟着的值

return不可返回栈内存的指针

因为该内存在函数结束时被自动销毁。

示例

char *Func(void)

{

           char str[30];

            ................

           return str;

}

const

const是constant的缩写,是恒定不变的意思。

精确的说是修饰只读变量,编译器在编译时不知道其存储的内容。

修饰只读变量

示例:

const int Max = 100;

const Array[Max];

C编译器报错。

节省空间,避免不必要的内存分配,同时提高效率

编译器通常不为const修饰的只读变量分配存储空间,而是将他们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得效率也很高。

修饰变量

int const i = 2;

const int i = 2;

修饰数组

int const array[2] ;

const int array[2]

修饰指针

修饰函数参数

void Func(cosnt int i);

告诉编译器在函数体中i不能改变,从而防止使用者无意或错误的修改。

修饰函数的返回值

volatile

易变、不稳定的意思,告诉编译器每次取值都要在内存中去取。

extern

外面的、外来的意思。

struct

空结构体

大小为1

柔性数组

至少有一个元素且最后一个元素未知大小的数组。

sizeof不包括柔性数组的内存,用malloc函数进行内存的动态分配,并且分配的内存大小要大于结构体的大小。

union

大小端模式

enum

枚举和define的区别

 

typedef

给数据类型取别名

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值