今天来讲讲c中的保留字。

保留字(reserved word)

  保留字又称关键字。

  指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用。

  每种程序设计语言都规定了自己的一套保留字。

  例如:BASIC语言规定不能使用LIST作为变量名或过程名,因为LIST是一个BASIC语言专用于显示内存程序的命令。

  C有22+10 = 32个关键字

  C++ 有22+10+11+20 = 63 个关键字

  JAVA 有22+ 9+ 17 = 48 个关键字

ps:以上内容来自百科。

其中,C89中,(C语言标准)中,

类型说明保留字:int,long,short,float,double,char,unsigned,signed,const,void,volatile,enum,struct,union
语句定义保留字:if,else,goto,switch,case,do,while,for,continue,break,return,default,typedef
存储类说明保留字:auto,register,extern,static
长度运算符保留字:sizeof

具体含义如下:

关键字 含义
auto 指定变量的存储类型,是默认值
break 跳出循环或switch语句
case 定义switch中的case子句
char 定义字符型变量或指针
const 定义常量或参数
continue 在循环语句中,回到循环体的开始处重新执行循环
default 定义switch中的default子句
do 定义do-while语句
double 定义双精度浮点数变量
else 条件不满足的其他情况
enum 定义枚举类型
extern 声明外部变量或函数
float 定义浮点型变量或指针
for 定义for语句
goto 定义goto语句
if 定义if语句或if-else语句
int 定义整型变量或指针
long 定义长整型变量或指针
register 指定变量的存储类型是寄存器变量,Turbo c中用自动变量代替
return 从函数返回
short 定义短整型变量或指针
signed 定义有符号的整型变量或指针
sizeof 获取某种类型的变量或数据所占内存的大小,是运算符
static 指定变量的存储类型是静态变量,或指定函数是静态函数
struct 定义结构体类型
switch 定义switch语句
typedef 为数据类型定义别名
union 定义无符号的整型或字符型变量或指针
unsigned 定义无符号的整型变量或数据
void 定义空类型变量或空类型指针,或指定函数没有返回值
volatile 变量的值可能在程序的外部被改变
while 定义while或do-while语句

下面,就几个我认为比较容易用错的保留字进行分析,主要包括 return, void, const, break, continue

至于存储类说明保留字,也是难点之一,在之前博客已经描述过了,这里就不在重复了。

以下内容参阅《c程序设计竞赛实训教程》和一些大牛博客结合自己看法写的。

1.return

return:结束一个函数并返回其后面表达式中的值。

初学的时候,有些不理解main 函数中return 0;有什么用,在写程序的时候老是忘记带上了。其实,带上return 0;是很有必要的。

main函数的返回值用于说明程序的退出状态,如果返回0,表示程序正常退出,否则表示程序异常退出。返回值传递给程序的激活者(操作系统)。

如果没有写return语句的话,c99(c语言标准)规定编译器自动在生成的目标文件中加入return 0;表示正常退出。

所以,为了代码规范,我们一般都必须带上return 0;

具体操作-----            return (表达式);

其中,括号是可以省略的。 一般不省略,如果返回值为表示式的时候容易造成混淆。

return返回值的类型,一般是函数定义的类型,如果return后表示式的值类型和函数值的类型不一致,则以函数函数类型为准,即:函数类型决定返回值类型。

需要注意的一点,也是易错的一点是:return不能返回指向局部变量的类型。----因为在函数结束时局部变量被自动销毁(上篇博客提及的局部变量的生存周期),则返回的指针为指向已释放的空间,再通过此指针进行操作就会产生错误。

下面通过程序具体说明:

  1. #include<stdio.h>
  2. int *test()
  3. {
  4. int num=3,*ptr; //num为局部变量
  5. ptr = #
  6. return ptr; //这里,返回了指向局部变量的指针
  7. }
  8. int main ( )
  9. {
  10. int i=4,*p;
  11. p = test();
  12. printf("%d,%d\n",i,*p);
  13. return 0;
  14. }

看下输出结果   4,3

程序中,函数test的返回值为指向局部变量num的指针,当主函数调用test函数的时候,返回ptr指针并且赋值给p指针变量,即num变量的地址赋给了p,但是必须明白,在test函数结束的时候,局部变量num的空间被释放了,这样用p来引用这个空间就会出错。

乍一看,和预期的一样,但是实际上,这样的程序是存在隐患的。

下面改改这个程序,就知道错在哪了。

  1. #include<stdio.h>
  2. int *test()
  3. {
  4. int num=3,*ptr; //num为局部变量
  5. ptr = #
  6. return ptr; //这里,返回了指向局部变量的指针
  7. }
  8. int test2()
  9. {
  10. int x = 9,y=7;
  11. return (x+y);
  12. }
  13. int main ( )
  14. {
  15. int i=4,*p;
  16. p = test();
  17. i = test2();
  18. printf("%d,%d\n",i,p);
  19. return 0;
  20. }

运行结果:  15,7(也可能是15,9视具体环境而定。)
在这里,多了个test2函数。发现结果并不是我们预料的15,3 。 p指向空间的数据不是之前num所赋值的3.

这正印证了我们之前说过了,这样的返回存在隐患。 在test函数调用完后,系统释放之前给num分配的空间,但是p指针仍然指向那块区域。

在调用test2的时候,系统要为x,y分配空间。这时候就会把之前释放的那块空间给x,y再次分配使用,使用在赋值语句后,该空间的值发现了改变,使得p发生了改变。

所以,切记 return不能返回指向局部变量的类型。

2.void

void :void为空类型。 void *为空类型指针。

其中,void a;是不允许的。  每次定义一个变量,系统都会为其分配空间,而void类型无法确定,系统就不知道该为它分配多大的空间,显然是不合理的。

void *p;是允许的,  因为这是一个指针变量,系统都是默认分配四个字节的空间,至于具体指向的空间总存放的数据类型,就由用户自行操作。

并且,在操作的时候,要把该void指针强制转换为相应类型的指针后才可进行操作。

如:

  1. void p;
  2. int a=5,b;
  3. p = &a;
  4. b = (int )p;//强转为int型指针。

即: 在使用void类型指针变量时,其他类型的地址可以直接赋值给void类型的指针变量,但反过来,void类型的指针变量赋值给其他类型的指针变量或取其所指空间数据时必须进行强转。

3.const

const:constant的缩写,意为不变。 即用const修饰的变量的不允许改变的。也可称为只读变量。

例如:  int const m = 10;   const int m = 10;  (二者可以认为等价,const定义一般的变量比较简单。例如该例中都是限定m为10)

但是要注意一点,只读变量虽然值不能改变,但它还是变量,不是常量。

如 int const M = 10;  int a[M];  这样定义数组是错误的。我们知道,定义数组时,数组元素个数必须是常量(这样系统才知道要分配多大的空间),而M的本质是变量,只是值不改变的变量而已。

所以,一般我们定义数组采用这样的操作:    #define M 10            int a[M];

下面讨论下const定义指针,这就比较复杂了。

  1. const int p;//const修饰的是p,表示p可变(地址可变),p所指空间的内容不可变(数据不变)
  2. int const p;//const修饰的是p,表示p可变(地址可变),p所指空间的内容不可变(数据不变)
  3. int const p;//const修饰的是p,表示p不可变(地址),p所指空间内容可变(数据可变)
  4. const int const p; //表示p和p所指的空间内容均不可变

至于地址,数据,拿const int p;举例。   此时,p=&a;操作是允许的,(修改地址)。而p=10;是允许的(试图改变数据造成错误)。

在判读是修饰p还是p时,我们可以先将定义中的类型标识符去掉(int),再观察const后面修饰的内容。

4,break,continue

至于break和continue,二者关系比较密切,结合探讨。  break退出当前循环,continue退出当次循环

continue
1、结束本次循环(不执行本次循环中continue后面的语句),继续下次循环条件判断;
2、不可作用于switch语句。当在switch中使用,这个continue实际是作用于其所属的循环结构;若它不属于任何一个循环,程序将因此报错!
break
1、结束整个循环,并停止下次循环条件判断;
2、可以作用于switch语句。
具体区别如下:

break和continue的区别如下: 
1. break可用于switch语句,表示跳出整个switch块,而continue则不能用于switch语句 
2. 它们都可用于循环语句的循环体,所谓的区别也应该是它们对循环次数的影响不同。break用于立即退出当前循环,而continue仅跳过当次循环(本次循环体内不执行continue语句后的其它语句,但下次循环还会执行)。举例说明。

  1. int i;
  2. int s = 0;
  3. for (int i = 1; i <= 10; i++)
  4. {
  5. if (i == 6) break;
  6. s += i;
  7. }

上面的循环会因为break语句而在i=6时提前终止,这样s的最终值就是1+2+3+4+5 
如将break换成continue

  1. int i;
  2. int s = 0;
  3. for (int i = 1; i <= 10; i++)
  4. {
  5. if (i == 6) continue;
  6. s += i;
  7. }

当i=6时就不会将i累加到s中,s的最终值是1+2+3+4+5+7+8+9+10,唯独少一个6

C语言保留字(关键字)汇总——转载相关推荐

  1. c语言中switch语句流程图_C语言:C语言保留字(关键字)

    保留字(reserved word) 保留字又称关键字. 指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用. 每种程序设计语言都规定了自己的一套保留字. 例如:BASIC语言规 ...

  2. C语言保留字(关键字)详解

    保留字(reserved word) 保留字又称关键字. 指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用. 每种程序设计语言都规定了自己的一套保留字. 例如:BASIC语言规 ...

  3. 【老九学堂】【初识C语言】C语言保留字(关键字)详解

    保留字(reserved word) 保留字又称关键字. 指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用. 每种程序设计语言都规定了自己的一套保留字. 例如:BASIC语言规 ...

  4. c语言系统关键字6,C语言语法之关键字

    由ANSI标准定义的C语言关键字共32个: auto double int struct break else long switch case enum register typedef char ...

  5. c++语言基础知识,c++语言基础知识汇总.ppt

    <c++语言基础知识汇总.ppt>由会员分享,可在线阅读,更多相关<c++语言基础知识汇总.ppt(68页珍藏版)>请在人人文库网上搜索. 1.1,第二章 C+语言初步,本章主 ...

  6. Java语言的关键字

    Abstract 抽象的 一个Java语言中的关键字,用在类的声明中来指明一个类是不能被实例化的,但是可以被其它类继承.一个抽象类可以使用抽象方法,抽象方法不需要实现,但是需要在子类中被实现 brea ...

  7. (MSDN)VB.NET的强大和C#语言的比较【转载】

    (MSDN)VB.NET的强大和C#语言的比较[转载] 2009-08-21 11:57 在网上经常能看到    一些评论和比较C#.VB.net优劣的文章.其中绝大多数都认为:VB.net就没有它存 ...

  8. C语言的关键字 extern

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105112033 C ...

  9. C语言register关键字——最快的关键字

    C语言register关键字-最快的关键字 (2012-08-24 14:09:24) 转载▼ 标签: 杂谈 分类: C/C    register:这个关键字请求编译器尽可能的将变量存在CPU内部寄 ...

  10. c语言计算机二级资料,2016年计算机二级C语言复习资料汇总

    2016年计算机二级C语言复习资料汇总 计算机二级考试几天之后就要开始了,yjbys小编来带你对C语言基本知识点再做一遍盘点吧! [考点1]C程序 C语言程序结构有三种: 顺序结构 , 循环结构(三个 ...

最新文章

  1. Windows下的socket演示程序
  2. debug assertion failed是什么意思?_MD5是是什么?为什么很多压缩文件上都有这个东西?...
  3. 一文让你彻底理解 Java HashMap
  4. 在移动互联网上赚钱,行不行
  5. 矩阵的Cholesky分解
  6. 使用Python Shells绕过杀毒软件
  7. ASP.NET运行模式
  8. VC(MFC)以ADO连接数据库(基于控件ListControl)
  9. 单、双链表的循环链表(十五)
  10. Linux文件类型与文件权限详解(二)
  11. VMware12虚拟机怎么下载安装?保姆级安装教程,让你一分钟学会
  12. Ricochet —— 基于 Tor 的加密即时通信工具
  13. [Acwing] 58周赛 4489. 最长子序列
  14. 致敬5G时代“她力量”,那些让人怦然“兴”动的女神们
  15. 分布式系统下的幂等性问题如何解决?
  16. vscode Android调试
  17. # 个人日记-电影《盛夏未来》观后感-20210802
  18. vue3 props 声明默认值
  19. LWIP+ENC28J60长时间运行后无法访问外网服务器
  20. 银行欺诈banking fraud

热门文章

  1. 使用 Inkscape 制作电子签名
  2. 鸡兔同笼头吃20脚56c语言,鸡兔同笼问题练习题答案.doc
  3. Axure原型分享:可视化统计图表
  4. JAVA中InputStream转base64
  5. 服务器装Win10虚拟机流畅,win10自带虚拟机和vmware哪个更流畅_win10自带虚拟机和vm哪个好用-win7之家...
  6. VSCODE常用快捷键
  7. 计算机网页文档无法复制怎么办,关于电脑浏览器网页不能复制网页文字的恢复教程...
  8. Tracking 1.3 Online Trackers
  9. 微信支付商户朋友圈广告
  10. python 网络小说爬取2