c语⾔code关键字⽤法,C语⾔关键字详解
相对于其他语⾔来说,C语⾔的关键字算是少的了。在C98中关键⼦总共只有32个,我们来分析⼀下每个关键字在C语⾔中它独特的作⽤。
1、关于数据类型的关键字
(1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数 (3) enum :声明枚举类型
enum类型可以增加可读性,可移植性;在enum中定义的每个对象,默认都是从0开始,当然也可以⾃定义。如下:
enum Color{RED,BLACK,WHITE};
enum Number{ONE=1,TWO,THREE};
Color中RED=0,BLACK=1,WHITE=2;
Number中ONE=1,TWO=2,THREE=3;
(4) float:声明浮点型变量或函数 (5) int: 声明整型变量或函数 (6) long :声明长整型变量或函数
(7) short :声明短整型变量或函数 (8) signed:声明有符号类型变量或函数 (9) struct:声明结构体变量或函数
结构体struct的作⽤已经在上⼀篇博⽂中讲到,可以⽤来实现C语⾔的封装,继承,多态等等。
union类型可以⽤来提⾼内存的使⽤率,如下:
int main(){
union Unoin{int a;float b;char *c;};
union Unoin p;
p.a = 100;
/*
执⾏语句1
*/
p.b = 10.0;
/*
执⾏语句2
*/
p.c = "hello world!";
/*
执⾏语句3
*/
return 0;
}
如果不使⽤union,我们需要分别定义int,float,cahr*,需要占⽤12字节的内存空间,但是当我们使⽤union时,只需要占⽤4字节即可;但是需要注意的时,我们在上⾯那个代码中执⾏语句2或者3中需要⽤到int a时,就⽆法使⽤union了,必须单独定义int a;否则读出的a值将会错误的。
(11) unsigned:声明⽆符号类型变量或函数 (12) void :声明函数⽆返回值或⽆参数,声明⽆类型指针(基本上就这三个作⽤)
2、关于控制语句的关键字
循环语句
(13) for:⼀种循环语句(可意会不可⾔传) (14) do :循环语句的循环体 (15) while :循环语句的循环条件
条件判断语句
(16)if: 条件语句 (17)else :条件语句否定分⽀(与 if 连⽤) (18)switch :⽤于开关语句 (19)case:开关语句分⽀ (20)default:开关语句中的“其他”分⽀
在switch语句中,当⼀个条件输⼊,从满⾜条件的那个case语句开始执⾏,直到遇到跳转指令(break;return;goto;contine;),所以建议在每条case语句后⾯加上break,除⾮你是刻意不那么做的。
跳转语句
(21)goto:⽆条件跳转语句
⽤goto语句可以保证程序存在唯⼀的出⼝,避免了过于庞⼤的if嵌套,但是随意使⽤goto语句就会对程序带来很⼤的隐患(可能会跳过变量的初始化、重要的计算语句等),影响代码的健壮性和可读性。所以不推荐过多地使⽤。
(22) continue:结束当前循环,开始下⼀轮循环
(23) break:跳出当前循环
(24)return :⼦程序返回语句(可以带参数,也可以不带参数)
在return语句之后函数中的所有指令都不会执⾏,所以需要确保在return语句之前执⾏完必要的指令。
3、关于存储类型的关键字switch的用法c语言
(25)auto :声明⾃动变量 ⼀般不使⽤,因为当我们声明⼀个局部变量是默认就是auto (26)extern:声明变量是在其他⽂件正声明(也可以看做是引⽤变量),⼀般也需要经常使⽤,因为在C语⾔⾥⾯,全局
变量和函数都是默认extern的属性 (27)register:声明寄存器变量,声明为register的变量是存放在CPU的寄存器⾥⾯的,所以读取速度⾮常快,但是数量有限,当定义的多个register变量,编译器多的那些register变量转换为auto变量。 (28)static :声明静态变量
a、当我们把⼀个全局变量声明为static时:只有它的作⽤范围变为本源⽂件,也就是属性由external变为internal,其它不变;
b、当我们把函数声明为static时:它的作⽤范围变为本源⽂件,也就是属性由external变为internal;
c、当我们把局部变量声明为static时:默认初始化值为0,并且只在第⼀次定义时初始化;内存存储区域不再是栈,⽽是在静态存储区;⽣命周期不再是所在函数,⽽是整个进程;其它不变。
4、其它⼀些关键字
(29)const :声明只读变量
由const声明的变量,必须在定义时进⾏初始化。如下:
const int num = 10;//在定义处初始化,并且变量的值不允许再改变
既然变量的值都不允许改变,那么这个变量定义了有啥⽤?哈哈,⽤处⼤着呢。⾸先在我们定义数组的时候,数组的⼤⼩就可以⽤const定义的常量来表⽰,这个就跟#define⼀样,但是它是类型安全的,#define是预处理命令,只是进⾏简单的字符替换,⽽编译器会对const定义的变量进⾏类型检查;其次,当我们需要⼀个不再改变的变量时,就可以⽤const,⽐如说定义⼀个⼈的性别,⾃打你⼀出⽣就已经决定了你的性别,不出意外的话,这辈⼦都不会改变了,所以就把它定义为只读的,当然有⼈也认为不定义为const也可以的嘛,只要⾃⼰不改变它就⾏,但是如果是那样的话,就需要⼈为来控制了,万⼀哪天忘了,把它改了怎么办?所以对于⼀些只读或者常量最好⽤const来定义。
当我们把const与指针变量放在⼀起的时候,问题就变得复杂了。⽐如我们定义如下:
const int *p1;
int const *p2;
int * const p3;
int const * const p4;
指针变量p1:const在数据类型之前,修饰的是p1所指向的对象,所以p1所指向的对象的值为常量只读,不能改变,但是p1本⾝可以改变;
指针变量p2:const在*之前,这种情况与p1相同;
指针变量p3:const在*之后,修饰的是变量p3,所以变量p3本⾝为常量只读,⽽p3所指向的对象可以改变;
指针变量p4:有两个const分别修饰变量p4和p4所指向的对象,所以p4本⾝和p4所指向的对象都为常量只读,都不可以改变。
其实这些也很容易记住,只要看const是在*前还是在*后⾯,在*前修饰的就是指针所指向的对象,在*后,修饰的就是指针本⾝。
下⾯来举个简单的例⼦说明:
int main(){
int num1 = 0;
int num2 = 1;
int num3 = 2;
int num4 = 3;
const int *p1;
int const *p2;
//int * const p3; //error(1)
int * const p3 = &num3;
//int const * const p4; //error(2)
int const * const p4 = &num4;
p1 = &num1;
//*p1 = 100;//error(3)
num1 = 100;//此时*p = 1;
/
/p3 = p4;//error(4)
*p3 = 100;
//p4 = p3;//error(5)
return 0;
}
在上⾯代码中,error(1)和error(2)很容易理解,因为const在*之后,所以指针p3,p4本⾝为只读,在定义时必须初始化。error(3)是因为对于p1指针,const在*之前,所以p1所指向的对象不能改变。error(4)和error(5)是因为对于p3,p4,有const在*之后,所以指针本⾝只读,在初始化之后,就⽆法再改变了。
(30)sizeof:计算数据类型长度
很多⼈不理解sizeof与strlen的区别:sizeof是运算符,⽽strlen是函数;sizeof计算的是数据类型的⼤⼩,⽽strlen计算的是字符串的长度;sizeof的参数既可以是数据类型,也可以是变量,⽽strlen的参数
只能是char*,⽽且必须是空字符结尾;sizeof返回值类型为unsigned,⽽strlen返回值为signed,因为它需要返回负数来表⽰出错情况。
(31)typedef:⽤以给数据类型取别名
typedef在程序设计⾥⾯很有⽤,当⼀个数据类型很长时(⽐如说函数指针),我们就可以⽤typedef来选⽤⼀个很合适的名字来替代它;当我们使⽤int,float,double这些类型时,也可以使⽤⾃⼰喜欢并且直观的名字来重新定义它,这样,当我们以后需要把项⽬中的float类型换成double类型的时候,我们就可以直接在typedef上把float换成double就可以,⽽不需要把所有代码⾥⾯每个float换成double。 (32)volatile:说明变量在程序执⾏中可被隐含地改变
volatile 修饰的变量不允许编译器对与它有关的运算做任何优化;⽤volatile定义的变量可能会在程序外被改变,所以每次都必须从内存中读取,⽽不能把他放在cache或寄存器中重复使⽤。⼀般⽤在以下⼏个地⽅:
a、并⾏设备的硬件寄存器(如:状态寄存器)
b、⼀个中断服务⼦程序中会访问到的⾮⾃动变量(Non-automatic variables)
c、多线程应⽤中被⼏个任务共享的变量
以上结论只是个⼈的见解与建议,如果上述所说有误或者⼤家有不同的见解,欢迎指正与讨论。
标签:语句,p3,const,变量,int,C语⾔,关键字,详解,声明
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论