c语言关键字总结

1.关键字变更历史

 

1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字:
inline restrict _Bool _Complex _Imaginary(注意bool 从来不是C语言的关键字)
 
2011年12月8日,ISO发布C语言的新标准C11,该标准新增了7个C语言关键字:
_Alignas _Alignof _Atomic _Static_assert _Noreturn _Thread_local _Generic
 
2.关键字列表
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
auto :声明自动变量
break :跳出当前循环
case :开关语句分支
char  :声明字符型变量或函数返回值类型
const  :声明只读变量
continue :结束当前循环,开始下一轮循环
default :开关语句中的“其它”分支
do  :循环语句的循环体
double  :声明双精度浮点型变量或函数返回值类型
else  :条件语句否定分支(与  if  连用)
enum  :声明枚举类型
extern:声明变量或函数是在其它文件或本文件的其他位置定义
float :声明浮点型变量或函数返回值类型
for :一种循环语句
goto :无条件跳转语句
if :条件语句
int : 声明整型变量或函数
long  :声明长整型变量或函数返回值类型
register:声明寄存器变量
return  :子程序返回语句(可以带参数,也可不带参数)
short  :声明短整型变量或函数
signed:声明有符号类型变量或函数
sizeof:计算数据类型或变量长度(即所占字节数)
static  :声明静态变量
struct:声明结构体类型
switch  :用于开关语句
typedef:用以给数据类型取别名
unsigned:声明无符号类型变量或函数
union:声明共用体类型
void  :声明函数无返回值或无参数,声明无类型指针
volatile :说明变量在程序执行中可被隐含地改变
while  :循环语句的循环条件

 

3.c语言关键字优点(c99,不是c11标准)


简洁紧凑、灵活方便

  ANSI C一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

运算符丰富

  C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。


数据类型丰富

  C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
同时对于不同的编译器也有各种强大的扩展功能。

另外

  C语言如此丰富数据类型及强大指针功能,其对硬件的管控能力极强,所以许多操作系统内核及MCU芯片程序开发都偏爱硬件。

 

4.这里可以提下volatile关键字,网上关于这个关键字有一些文章,参考 这篇 

 

  volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以消除一些代码。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化。

  volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)

 

看两个事例:

1>告诉compiler不能做任何优化

1
2
3
4
5
6
7
8
9
10
11
12
比如要往某一地址送两指令:
int  *ip =...;  //设备地址
*ip =  1 //第一个指令
*ip =  2 //第二个指令
以上程序compiler可能做优化而成:
int  *ip = ...;
*ip =  2 ;
结果第一个指令丢失。如果用 volatile , compiler就不允许做任何的优化,从而保证程序的原意:
volatile  int  *ip = ...;
*ip =  1 ;
*ip =  2 ;
即使你要compiler做优化,它也不会把两次付值语句间化为一。它只能做其它的优化。

  

2>用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
volatile  char  a;
 
a= 0 ;
 
while (!a){
 
//do some things;
 
}
 
doother();
 
如果没有 volatiledoother()不会被执行

 本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/3646919.html,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值