设为首页 加入收藏

TOP

C语言关键字详解(一)
2015-08-31 21:25:10 来源: 作者: 【 】 浏览:66
Tags:语言 关键字 详解

  相对于其他语言来说,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语言的封装,继承,多态等等。


  请参考http://www.cnblogs.com/whc-uestc/p/4677414.html
  (10) union:声明共用体(联合)数据类型


  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:开关语句中的“其他”分支


  在case...switch语句中,当一个条件输入,从满足条件的那个case语句开始执行,直到遇到跳转指令(break;return;goto;contine;),所以建议在每条case语句后面加上break,除非你是刻意不那么做的。


  跳转语句


  (21)goto:无条件跳转语句


  用goto语句可以保证程序存在唯一的出口,避免了过于庞大的if嵌套,但是随意使用goto语句就会对程序带来很大的隐患(可能会跳过变量的初始化、重要的计算语句等),影响代码的健壮性和可读性。所以不推荐过多地使用。


  (22) continue:结束当前循环,开始下一轮循环


  (23) break:跳出当前循环


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


  在return语句之后函数中的所有指令都不会执行,所以需要确保在return语句之前执行完必要的指令。


?3、关于存储类型的关键字


  (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 =

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java 9新功能之HTTP2和REPL 下一篇使用值类型构建更好的Swift应用程..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: