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语言的封装,继承,多态等等。

  请参考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 = 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、多线程应用中被几个任务共享的变量

以上结论只是个人的见解与建议,如果上述所说有误或者大家有不同的见解,欢迎指正与讨论。

时间: 2024-10-22 04:29:06

C语言关键字详解的相关文章

【C语言天天练(十四)】const关键字详解

const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,了解const的作用,在看别人的代码时,对理解对方的程序有一定帮助. 1.const可以理解成是"只读变量"的限定词,从这里可以看出,const修饰的是变量,跟常量是不同的,常量是被编译器放在内存中的只读区域,当然也就不能够去修改它.而"只读变量"则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改.const就是用来限定一

java关键字详解

Java关键字及其作用 目录 Java关键字及其作用--- 1 一.     关键字总览:2 二.     详细解释--- 3 1.访问控制--- 3 1)私有的-- 3      private 2)受保护的-- 3      protected 3)公共的-- 3      public 2.类.方法和变量修饰符--- 3 1)声明抽象-- 3      abstract 2)类-- 4      class 3)继承.扩展-- 4      extends 4)最终.不可改变-- 4   

“全栈2019”Java异常第九章:throws关键字详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异常第九章:throws关键字详解 下一章 "全栈2019"Java异常第十章:throw与throws区别详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Ja

T-SQL之JOIN关键字详解

这几天由于工作的需要,写了一个业务逻辑较复杂的存储过程,其中多次用到了JOIN.LEFT JOIN.RIGHT JOIN在处理表之间的逻辑的作用被渲染的淋漓尽致.说明一下,之前少处理数据库后台的经验,特别是没有好好的研究SQL的知识细节.不过也简单的学习了,自以为看明白了.就懂了.现在想来那时就是浅尝辄止.用了之后,对它的理解更深了.现在及时总结下.以备忘和日后查看.下面示例的demo代码是来自W3School.接下来直入主题. JOIN 1 SELECT Persons.LastName, P

彻底搞定C语言指针详解

1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: 内存地址→ 6 7 8 9 10 11 12 13 ----------------------------------------------------------------- ... | | | | | | | |.. ------------------------------- ---------------------------

php关键字详解

1.abstract:修饰抽象类,抽象方法,不可以被实例化 2.extends:继承父类中的所有属性和方法 3.implements:使用接口,一个类只能继承一个类,但可以使用多个接口,接口中的方法全部为抽象方法,使用时,必须全部实现; 4.interface:定义接口类; 5.define:定义全局常量;  define("student", "chen"); 6.const:只能修饰类中的常量; const COUNTRY = "china"

11_Shell语言———管道详解

管道的基本用法为: COMMAND1 | COMMAND2 | COMMAND3 | ... COMMAND1 的输出结果会作为输入参数传递给COMMAND2, COMMAND2加以处理后会传递给COMMAND3, 依此类推.管道的使用便是Linux哲学思想中"组合小程序完成复杂任务"的体现方式. 如果管道的最后一个命令是在当前shell的子shell中执行,那么该执行结果不能保存为一个变量,这样会导致当前shell无法获取执行结果,这是由shell中"本地变量只对当前she

Delphi 关键字详解

absolute//它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var   Str: string[32];   StrLen: Byte absolute Str; //这个声明指定了变量StrLen起始地址与Str相同. //由于字符串的第0个位置保存了字符串的长度, 所以StrLen的值即字符串长度. begin   Str := 'abc';   Edit1.Text := IntToStr(StrLen); end; abstract//它允许你创建抽象的方法

Java 多线程(六) synchronized关键字详解

Java 多线程(六) synchronized关键字详解 多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题. 同步机制可以使用synchronized关键字实现. 当synchronized关键字修饰一个方法的时候,该方法叫做同步方法. 当synchronized方法执行完或发生异常时,会自动释放锁. 下面通过一个例子来对synchronized关键字的用法进行解析. 1.是否使用synchronized关键字的不同 例子