C语言中的关键字
auto
auto用于声明一个变量为自动变量
continue
continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。
enum
枚举enum就是英文enumerate的缩写,也就是列举、排列说明的意思。枚举类型是C语言中的一种特殊类型,枚举类型可以让我们的程序使用一些固定长度和固定数值的变量值范围。
restrict
restrict只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.
static
1、修饰变量——静态全局变量:全局变量前加static修饰,该变量就成为了静态全局变量。
2、修饰函数——修饰函数则该函数成为静态函数,函数的作用域仅限于本文件,而不能被其它文件调用。
unsigned
unsigned的作用就是将数字类型无符号化, 例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。看起来unsigned 是个不错的类型,尤其是用在自增或没有负数的情况。但是在实际使用中会出现一些意外的情况。
_complex
_Complex表示一种基本数据类型——复数。该类型的出现主要是为了解决工程和数学计算上很多涉及到复数计算的情况
建议调用<complex.h>的标准头文件,使用里面的complex代替_Complex
支持的_Complex有三种复数类型:
1. double complex a = 1.3;
2. double complex b = 2.3 + 4 * I;
3. double complex c = 5.3 * I;
使用<complex.h>头文件可以更方便的完成复数问题(虚数单位i写作大写的I):
break
当 break 关键字用于 while、for循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
default
default关键字用在switch分支语句中,一般与case搭配使用,含义是缺省的其他条件。
default的作用是:标记switch语句中的缺省情况下的程序开始位置
extern
1.一个c文件需要调用另一个c文件里的变量或者函数,而不能从.h文件中调用变量。
2.extern int a = 5与int a = 5意义是一样的,都是定义。而extern int a;是声明。但会产生一条警告
3.引用函数,引用变量是一样的,如果需要调用其他.c文件中的函数,在文件中的函数声明前加extern即可,不加extern而直接声明函数也可以,因为声明全局函数默认前面带有extern
4.如果不想让其他.c文件引用本文件中的变量,加上static即可。static 表示静态的变量,限制此变量作用域在一个源文件内,其他文件不能用extern来引用此变量,不仅适用于变量,函数也可以。
5.extern和include的区别include相当于把include .h文件直接带入到本源文件里,比如在b.c文件里include "a.h",就相当于把a.h文件里所有定义的变量和函数全部拷贝了一份放入了b.c里,一个项目里,一个.h文件可能会被多个.c源文件包含,这样编译的时候就会报重复定义的错误。而且尽量不要在.h里定义变量,这是一个不好的习惯。
6.头文件被C++程序引用extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。
inline
在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
return
return 0 代表程序正常退出,return 1代表程序异常退出!
使用return 语句可以返回一个变量内的值或一个指针,也可用return0,表示返回为空。
return 代表调到函数外,
return 0代表函数正常终止
return 1代表函数非正常终止
return 关键字的作用是返回程序流程的控制权!
其副作用是返回一个值。
struct
struct是C语言中的一种数据类型,它的作用是可以将不同类型的变量组合在一起,形成一个新的数据类型。 通过使用struct,可以将相关的数据集中管理,并且可以方便地进行操作和传递。 在C语言中,struct可以用来定义自定义的数据类型。 它可以包含不同类型的变量,比如整型、浮点型、字符型等等。
void
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
_imaginary
_Imaginary表示一种基本数据类型——虚数
与_Complex一样,该类型的出现主要是为了解决工程和数学计算上很多涉及到复数计算的情况
_Imaginary的作用是:声明虚数类型。
_Imaginary也很少使用了,一般都建议调用一个叫<complex.h>的标准头文件,使用里面的imaginary代替_Imaginary
C99后支持的_Imaginary有三种虚数类型:
float _Imaginary a; /* 虚数类型的实部为0 */
double _Imaginary b; /* 与上述类似 */
long double _Imaginary c;
case
“case常量表达式只是起语句标号作用,并不是该处进行条件判断。在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不在进行判断,直到碰到break或函数结束为止。”
do
do关键字在C语言中不能单独使用
它需要和while关键字配套使用表示一种退出条件循环结构
其区分于while循环和for循环,这二者叫做入口条件循环
do关键字的作用是:
与while关键字配套表达一种退出条件循环结构(do-while结构)
入口条件循环(while,for)就是先判断是否有循环条件,再进入循环执行,
而退出条件循环(do-while)就是不管三七二十一先执行一轮,再看是不是还要继续循环。
float
float数据类型用于存储单精度浮点数或双精度浮点数,浮点数使用 IEEE(电气和电子工程师协会)格式。浮点类型的单精度值具有 4 个字节,包括一个符号位、一个 8 位 excess-127 二进制指数和一个 23 位尾数,尾数表示一个介于 1.0 和 2.0 之间的数,由于尾数的高顺序位始终为 1,因此它不是以数字形式存储的。如果存储比精度更重要,请考虑对浮点变量使用 float 类型。相反,如果精度是最重要的条件,则使用 double 类型。
double
C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。
double数据类型,C标准规定,double类型必须至少能表示10位有效数字,且取值范围至少是10-37~10+37。double数的两个特征:
double数据类型表达的也是一个近似的数,不是准确的,小数点后的n位有误差,浮点数的位数越大,误差越大,到18位的时候,误差了1,基本上不能用了。用“==”可以比较两个double数值是否相等。float浮点型的精度最多只有8位,并且不能用==判断两个浮点数是否相等,在实际开发中,弃用float,只使用double型就可以了。
int
C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负。int是整型之一,一般被称为整型。以后,在不产生歧义的情况下,我们把整数类型和int都称为整型。 int代表有符号整数,也就是说,用int声明的变量可以是正数,可以是负数,也可以是零,但是只能是整数。标准规定int的最小取值范围是 -32767 到 32767。
short
short,本意是“短,矮”的意思,在C语言中声明一种短整数类型,与long相对应。short与int类似,是较早出现的数据类型和较早使用的关键字之一,使用short是希望在内存中的占用空间比int小,但目前只能说,short类型只保证其在内存中的占用空间小于等于int类型
short的作用是:声明短整型变量。
switch
switch语句是一个多分支选择语句,并且可以支持嵌套。
switch语句的基本格式
switch(表达式)
{
case 常量1:语句1
case 常量2:语句2
default:语句n
break;
}
switch语句通过将表达式的值与常量值进行比对,如果相等则执行后面的语句,如果不相等则跳到下一个case语句,当表达式和常量值相等,switch语句会将当前case语句以及后面所有的case语句全部输出。
volatile
volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错
char
字符型 (char)用于储存字符(character),如英文字母或标点。严格来说,char 其实也是整数类型(integer type),因为 char 类型储存的实际上是整数,而不是字符。计算机使用特定的整数编码来表示特定的字符。
2. 声明字符型变量,字符型变量的声明方式和其它类型变量的'声明方式一样:
char good; char better, best;
以上代码声明了三个字符型变量:good、better,和 best。
3. 字符常量与初始化
我们可以使用以下语句来初始化字符型变量:char ch = 'A';
这个语句把ch的值初始化为 A 的编码值。在这个语句中,'A' 是字符常量。C 语言中,使用单引号把字符引起来就构成字符常量
for
for 是一个循环语句,和while是类似的for是C语言中的一个关键字,主要用来控制循环语句的执行。
long
long 是C语言的一个关键字,代表一种数据类型,中文为长整型。
2. long是long int的简写,也就是说,在C语言中long int类型和long类型是相同的。
3. 每个long型占4个字节,在32位编译系统下,long和int占的空间是相同的。这也导致了long型变量使用的越来越少了。
4. long型可以表示的整型数字范围为-2,147,483,648 ~ 2,147,483,647, 即-2^32 ~ 2^32-1。在用在C的格式化输入输出时,long型的格式化字符为"%ld"。
5. long同其它整型类型一样,可以同unsigned 联合使用,形成unsigned long,即无符号长整型, 其格式化字符为"%lu"。
6. 在部分编译器下,比如gcc, 两个long合用,即long long类型,表示C语言目前最长的系统整型类型,每个long long类型占8字节,64位。其格式化字符为"%lld"。
signed
sign的本意是“标记,做记号”,ed后缀有一种完成时的感觉,这里表示的是有符号的。signed关键字是ISO/ANSI C90标准新增的,其常见于整数类型的符号规定处 。signed的作用是:声明有符号类型的整数类型。其实说signed很常见也不见得,因为我们常用的int、short和long,以及long long,默认情况下都是signed有符号的。所以相比起来unsigned的戏份可能比signed更多,signed在这里只是相当于刻意地去说明其后面的变量是有符号类型的。
typedef
typedef关键字就是给这些数据类型起一个别的名字,然后用这个自己起的名字来定义变量。
while
当n==1时执行while循环结构里的语句,当n不等于1时,则跳过该循环执行循环体外的语句。
while 循环的格式:while (表达式){语句;}
while 循环的执行顺序:当表达式为真,则执行下面的语句,语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的语句,然后再判断表达式是否为真……就这样一直循环下去,直到表达式为假,跳出循环。
const
const是一个C语言(ANSI C)的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助。定义:const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
主要作用
1、可以定义const常量,具有不可变性
2、便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。例如: void f(const int i) { …} 编译器就会知道i是一个常量,不允许修改;
3、可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
4、节省时间和提高效率,编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
If、else if 、else
简单介绍三种形式的条件判断语句:if、else if、else
if:
if(表达式)
执行语句
if:判断表达式内容,如果为true(真),就执行语句
else if:
<span style="color:#333333">if(表达式)
执行语句
else if(表达式1)
执行语句1
......(很多的else if)
else if(表达式m)
执行语句m</span>
else if:如果if的判断没有通过,则进行下面的else if,如果当前的else if判断通过,则执行当前else if的语句。如果没通过,则一直执行下面的else if判断
else:
if(表达式)
执行语句
else if(表达式)
执行语句
else
执行语句
else:else为最后的分支,如果在else之前的if、else if判断都没有通过就会执行else
注意:在一条if条件判断中,可以有无数条else if,但是只能有一个else
goto
goto语句常见用法是终止程序在某些嵌套的结构的处理过程
register
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中以加快其存储速度。但是使用register修饰符有几点限制
(1)register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。
(2)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。
(3)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。
(4)局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;
(5)由于寄存器的数量有限(不同的cpu寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。
sizeof
sizeof是C语言中保留关键字,也可以认为是一种运算符,单目运算符,可以获取某个数据类型所占用空间的字节数。
sizeof实际上是获取了数据在内存中所占用的存储空间,以字节为单位来计数。
C语言会自动在在双引号""括起来的内容的末尾补上"\0"代表结束,ASCII中的0号位也占用一个字符。
C/C++中,sizeof()只是运算符号,是编译的时候确定大小的。动态分配是运行过程中得到大小的,也就是说C++中new出来的内存,sizeof都无法统计的,退一步说,即使是new出来的空间也有可能失败,所以sizeof无法统计动态分配的内存大小。
Sizeof与strlen的区别
sizeof是C语言中的一个单目运算符,用来计算数据类型所占空间的大小,单位为字节;而strlen是一个函数,用来计算字符串长度。
注:strlen是函数,不是关键字!!
union
union 共用体名
{
成员列表
};
union,“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。
结构体和共用体的区别在于: 结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
为什么使用union?
1.解决“相同信息”的困扰,避免重复代码,提高代码的简洁性。相同成员公用,差异成员则通过 union 区分,这就避免了代码重复,也避免了代码耦合。
2.节省内存。C语言程序常用于资源比较紧张的嵌入式设备中,因此合格的C语言程序员应该都是“抠门”的,尽可能的节约资源。如果一些数据不可能在同一时间同时被用到,则可以使用union。
_bool
布尔型(bool)变量的值只有 真 (true) 和假 (false)。
应用:
①布尔型变量可用于逻辑表达式,也就是“或”“与”“非”之类的逻辑运算和大于小于之类的关系运算,逻辑表达式运算结果为真或为假。
②bool可用于定义函数类型为布尔型,函数里可以有 return TRUE; return FALSE 之类的语句。
③布尔型运算结果常用于条件语句:
if (逻辑表达式){如果是 true 执行这里;}
else{如果是 false 执行这里;};
使用bool逻辑型变量的优点:
1、 提高程序的可读性
bool类型的变量只可能有两个值true或false,在没有统一的布尔类型在大型的工程项中特别是用到第三方程序库时,可能使用不同的手段模拟布尔类型以提交代码的可读性,这样会使得代码有些混乱,C语言中引入了bool内置类型,解决了代码的一致性问题。
2、提高程序的性能
bool在绝大多数编译器编译时都将其实现为1字节,即sizeof(bool)的值为1,加上其只有两个值的值域{true, false},是C语言中最小的数据类型了。
虽然char、unsigned char和signed char类型在C语言中没有特定的实现要求,但一般也实现为一个字节,这样看来与bool类型从内存空间的占用上并没有性能上的差异。