C语言加餐--一些关键字
C语言大约有32个关键字,一些常用的关键字在C语言复习笔记中会提到和了解用法.这里会补充一些不太常用的关键字以作了解.
auto
学过C++的应该都很了解这个关键字,但是它在C语言中却不是自动推导类型的关键字,他是一个表示局部变量的关键字,表示出作用域就会销毁.在现在C语言中基本已经被省略了,正常定义的局部变量通常都默认带auto这个关键字.可以不用太在意.如果想用auto修饰就像下面一样使用即可.
auto int a = 1;
register
register这个关键字被称为最快的关键字,这个名字来源与什么呢?因为register这个关键字会建议编译器将它修饰的关键字放到寄存器中.(寄存器是CPU可以最快访问到的存储单元,它们集成在CPU内部,但是数量很少).所以一个程序中有一两个变量被register修饰就很多了.
因为register修饰的变量被建议放入寄存器中,所以被他修饰的变量不需要在内存中开辟空间,也就是不支持取地址.而且被它修饰的便量不进行写回操作(写回是指从CPU内像内存变量中写入值).
那么什么样的变量可以被register修饰呢?
1.局部变量,会被大量重复使用(高频读取的)
2.基本不会更改这个变量的值(不会被写入)
3.如果要使用这个关键字不要大量使用,因为寄存器数目有限.(不过这个关键字只是建议性作用,是否存入寄存器要看编译器自己判断).
补:计算机内部采用分级存储的方式,离CPU越进的存储单元容量越小,造价越贵.
离CPU从近到远:寄存器 cache 内存 硬盘 ssd 磁盘....
#include<stdio.h>int main()
{register int i=0;//printf("%d\n",&i);//err//不可以&,会报错return 0;
}
static
在C语言阶段已经学习过了static的用法,这次我们先来看一下与这个关键字相关的一些多文件相关的知识
多文件
在开始学习时我们通常只用到源文件,但是在使用过程中我们就发现有很多不方便的地方,比如当多文件时我们要在当前文件使用另一个文件中的变量和函数时就要在当前文件下用extern进行声明.一个文件时还好,但是当多个文件都要用同一个文件中的多个变量和函数时就要进行大量重复的声明.
这时头文件的作用就显现出来了,将需要多次使用的函数,变量的声明都放在头文件中即可,同时头文件中还需要包含多文件中需要用到的库中的头文件.(在声明外部变量和函数时需要用extern进行修饰).在之后的文件中只要included"头文件"即可.
头文件可能会被重复包含,为了防止这种事情的发生我们需要在自己写的头文件前面加入#pragma once来防止这个事情的发生.
但函数不进行声明也不会报错,只会报警告.
因为函数在链接时才会去找函数体.
在编译时是各个文件分开编译,在没有声明的情况下编译器会对函数报警告,但在链接时各个文件之间可见了,所以编译器可以找到函数的定义.这样就不会报错.
尽管这样也建议在使用外部函数时用extern进行声明.
//函数声明
//extern 函数返回类型 函数名 (参数类型和参数名);
extern int Add(int x,int y);//变量声明
//extern 变量类型 变量名
extern int a;
补:全局函数和函数都可以跨文件使用.static修饰局部变量时改变局部变量的声明周期是因为他改变了变量在进程地址空间的存储位置.(由栈改到了全局数据区).
static关键字
C语言复习-- static和extern-CSDN博客
static修饰函数和全局变量时,尽管会让他们只在当前文件中有效,但是在可以设置相应的接口让外部文件通过接口来访问.
//test.c
static int a = 0;
static void A()
{printf("hello\n");
}void p()
{printf("%d\n",a);A();
}
//main.c
int main()
{//extern int a;//printf("%d\n",a);//err//A();//err//不可以直接使用p();//但是可以间接通过接口来使用return 0;
}
sizeof
在C语言也有提及过.主要重复一下sizeof不是函数.其他可能在后面在补充一点.
谈到sizeof就会谈到性关联的类型.下面就简单的谈谈与这部分相关的问题.
类型与变量
为什么要有类型呢?
我们程序内部要存在内存之中,要是没有类型我们就不知道内容要占多少空间,没有办法分配内存.而有了类型之后我们就可以根据类型的大小来分配内存空间,是空间得到更好的利用.
为什么要有变量?
一个程序开始执行是就会在内存中开辟空间,但是数据必须要在CPU内进行运算,而CPU中寄存器的位置很少,cache的空间也不大,所以无法将所有的要进行运算的值放入CPU中,于是就将他们放在内存中的变量里存储.
数据存储
下面来扩充一下这部分关于数据存储的知识(包括大小端).
数据在存的过程中是与类型无关的,存储只存储数据的二进制形式,即在数据存进去之前,就要转化为二进制.类型在存储时只是开辟相应的空间来存放二进制的,如果二进制超除所需范围则会发生截断.在取的过程中,首先要判断数据的存储方式是大端还是小端?然后将数据的二进制以对应的方式还原.之后按照相应的类型的存储方法进行解析.(看是否是有符号的类行,是整型还是浮点型).
注:在大小端方面,因为CPU中数据存储的基本单位是字节,所以大小端只有在多字节时才需要考虑,当只有1个字节时无需考虑大小端.
这篇就先补充这一些关键子,之后的一些关键字可能回合语句一起进行补充.