C语言关键字详解
相对于其他语言来说,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语言关键字详解的更多相关文章
- 【转载】C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- “全栈2019”Java多线程第十六章:同步synchronized关键字详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第九章:throws关键字详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java异常第八章:throw关键字详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- java关键字(详解)
目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...
- “全栈2019”Java第五十一章:继承与final关键字详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- python关键字详解
今天依旧在啃:<笨方法学python>,其中习题37是复习各种关键字.我本想百度一下记一下就ok了,但是百度出来第一个就Hongten的博客.我才意识到我也有博客,我应该学习他,把这些积累 ...
- Java面试题04-final关键字详解
Java面试题04-final关键字详解 本篇博客将会讨论java中final关键字的含义,以及final用在什么地方,感觉看书总会有一些模糊,而且解释的不是很清楚,在此做个总结,以备准备面试的时候查 ...
- Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.
在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...
随机推荐
- C#引用C++代码
现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前搞VC++开发的人都转向用更强大的VS.Net.在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类 ...
- 【循序渐进学Python】11.常用标准库
安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...
- sql: table,view,function, procedure created MS_Description in sql server
--添加描述 geovindu --https://msdn.microsoft.com/en-us/library/ms180047.aspx --https://msdn.microsoft.co ...
- windows下使用makecert命令生成自签名证书
1.makecert命令路径 C:\Program Files (x86)\Windows Kits\8.1\bin\x64 2.生成一个自签名证书 makecert -r -pe -n " ...
- IOS6学习笔记(三)
1.ARC空声明变量 使用ARC的另一个优势是所有未初始化的变量默认都是“空值化”的.这意味着像下面这样的声明使用ARC编译后指向的是空值(nil): NSObject *myObject1,*myO ...
- Flexbox实现垂直水平居中
Flexbox(伸缩盒)是CSS3中新增的特性,利用这个属性可以解决页面中的居中问题.只需要3行代码就可以实现,不需要设置元素的尺寸,能够自适应页面. 这个方法只能在现代浏览器上有效,IE10+.ch ...
- Threading.Tasks 简单的使用
using Lemon.Common; using System; using System.Collections.Generic; using System.Linq; using System. ...
- Android NDK
1.Android之NDK开发 http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html
- IOS 自定义按钮(代码实现)+九宫格
在一些下载应用里整个页面都是按钮,有好多好多,但是仔细观察不难发现他们很有规律.就像下面一样
- GCD中的dispatch_set_target_queue的用法及作用
(一),使用dispatch_set_target_queue更改Dispatch Queue的执行优先级 dispatch_queue_create函数生成的DisPatch Queue不管是Ser ...