相对于其他语言来说,C语言的关键字算是少的了。在C98中关键子总共只有32个,我们来分析一下每个关键字在C语言中它独特的作用。

1、关于数据类型的关键字

  (1) char :声明字符型变量或函数 
  (2) double :声明双精度变量或函数 
  (3) enum :声明枚举类型

  enum类型可以增加可读性,可移植性;在enum中定义的每个对象,默认都是从0开始,当然也可以自定义。如下:

enum Color{RED,BLACK,WHITE};
enum Number{ONE=,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 = ;
/*
执行语句1
*/
p.b = 10.0;
/*
执行语句2
*/
p.c = "hello world!";
/*
执行语句3
*/ return ;
}

  如果不使用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 = ;//在定义处初始化,并且变量的值不允许再改变

  既然变量的值都不允许改变,那么这个变量定义了有啥用?哈哈,用处大着呢。首先在我们定义数组的时候,数组的大小就可以用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 = ;
int num2 = ;
int num3 = ;
int num4 = ;
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 = ;//此时*p = 1;
//p3 = p4;//error(4)
*p3 = ;
//p4 = p3;//error(5) return ;
}

  在上面代码中,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、多线程应用中被几个任务共享的变量

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

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

  1. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  2. “全栈2019”Java多线程第十六章:同步synchronized关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

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

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  4. “全栈2019”Java异常第八章:throw关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  5. java关键字(详解)

    目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...

  6. “全栈2019”Java第五十一章:继承与final关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. python关键字详解

    今天依旧在啃:<笨方法学python>,其中习题37是复习各种关键字.我本想百度一下记一下就ok了,但是百度出来第一个就Hongten的博客.我才意识到我也有博客,我应该学习他,把这些积累 ...

  8. Java面试题04-final关键字详解

    Java面试题04-final关键字详解 本篇博客将会讨论java中final关键字的含义,以及final用在什么地方,感觉看书总会有一些模糊,而且解释的不是很清楚,在此做个总结,以备准备面试的时候查 ...

  9. Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.

    在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...

随机推荐

  1. PowerShell 从网站上下载文件

    在cmd下 执行powershell,可能会出现禁止运行的策略, 运行如下命令: powershell set-executionpolicy remotesigned 然后运行: powershel ...

  2. Unity烂笔头1-自定义INSPECTOR属性窗口节点项

    1.添加输入框和标签 LevelScript: using UnityEngine; using System.Collections; public class LevelScript : Mono ...

  3. 【JS复习笔记】04 数组

    JS里的数组其实并不是一个数组,它其实是一个对象,a[1]这种调用方式其实就是一个字面量为1的属性. 因为这东西实际上是一个对象,所以你就可以理解下面这种声明了吧! var arrName=['我可以 ...

  4. 重新想象 Windows 8 Store Apps (55) - 绑定: MVVM 模式

    [源码下载] 重新想象 Windows 8 Store Apps (55) - 绑定: MVVM 模式 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 绑定 通过 M ...

  5. 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性

    [源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...

  6. No.003:Longest Substring Without Repeating Characters

    问题: Given a string, find the length of the longest substring without repeating characters.Example:Gi ...

  7. 线上mysql内存持续增长直至内存溢出被killed分析(已解决)

    来新公司前,领导就说了,线上生产环境Mysql库经常会发生日间内存爆掉被killed的情况,结果来到这第一天,第一件事就是要根据线上服务器配置优化配置,同时必须找出现在mysql内存持续增加爆掉的原因 ...

  8. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  9. CSS中background背景色的作用范围

    在div中设置背景色:当border宽度很大时就要考虑一个问题,那就是背景的作用范围,是包括边框呢?还是不包括呢?很明显,又到浏览器产生分歧的时候了. 在IE中背景色的作用范围为:content+pa ...

  10. andriod arcgis加载影像TIF

    private static final String TAG = "MainActivity"; private MapView mapView = null; @Overrid ...