关键字:

C语言关键字32个:

关键字                                         意 义

auto                           声明自动变量,缺省时编译器一般默认为 auto

int                               声明整型变量

double                       声明双精度变量

long                            声明长整型变量

char                            声明字符型变量

float                           声明浮点型变量

short                          声明短整型变量

signed                        声明有符号类型变量

unsigned                   声明无符号类型变量

struct                         声明结构体变量

union                          声明联合数据类型

enum                         声明枚举类型

static                         声明静态变量

switch                        用于开关语句

case                           开关语句分支

default                       开关语句中的“其他”分支

break                         跳出当前循环

register                     声明寄存器变量

const                          声明只读变量

volatile                      说明变量在程序执行中可被隐含地改变

typedef                      用以给数据类型取别名(当然还有其他作用)

extern                        声明变量是在其他文件正声明(也可以看做是引用变量)

return                        子程序返回语句(可以带参数,也可不带参数)

void                            声明函数无返回值或无参数,声明空类型指针

continue                    结束当前循环,开始下一轮循环

do                               循环语句的循环体

while                           循环语句的循环条件

if                                  条件语句

else                            条件语句否定分支(与 if 连用)

for                               一种循环语句(可意会不可言传)

goto                           无条件跳转语句

sizeof                         计算对象所占内存空间大小

auto:编译器在默认的缺省情况下,所有变量都是auto的。

register:这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内

存寻址访问以提高效率。

register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。 而且 register 变量可能不存放在内存中, 所以不能用取址运算符“ &”来获取 register 变量的地址。

static:这个关键字在 C 语言里主要有两个作用。

第一个作用:修饰变量。变量又分为局部和全局变量,但它们都存在内存的静态区。

静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用 extern 声明也没法

使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些

代码行也不能使用它。想要使用就得在前面再加 extern ***。

静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他

函数也用不了。由于被 static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。

第二个作用:修饰函数。函数前加 static 使得函数成为静态函数。函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

【规则 1-1】命名应当直观且可以拼读,可望文知意,便于记忆和阅读。

【规则 1-2】命名的长度应当符合“min-length && max-information”原则。

【规则 1-3】当标识符由多个词组成时,每个词的第一个字母大写,其余全部小写。

【规则 1-4】尽量避免名字中出现数字编号,如 Value1,Value2 等,除非逻辑上的确需要编

号。比如驱动开发时为管脚命名,非编号名字反而不好。

【规则 1-5】对在多个文件之间共同使用的全局变量或函数要加范围限定符(建议使用模块名(缩写)作为范围限定符)。

【规则 1-6】标识符名分为两部分:规范标识符前缀(后缀) + 含义标识 。非全局变量可以不用使用范围限定符前缀。

【规则 1-7】作用域前缀命名规则。

【规则 1-8】数据类型前缀命名规则。

【规则 1-9】含义标识命名规则,变量命名使用名词性词组,函数命名使用动词性词组。

【规则 1-10】程序中不得出现仅靠大小写区分的相似的标识符。

【规则 1-11】一个函数名禁止被用于其它之处。

【规则 1-12】所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词。

风格这些应与项目中一致,与项目开发成员共同约定并在详细设计文档中给出

【规则 1-13】考虑到习惯性问题,局部变量中可采用通用的命名方式,仅限于 n、 i、 j 等作为循环变量使用。

【规则 1-14】定义变量的同时千万千万别忘了初始化。定义变量时编译器并不一定清空了

这块内存,它的值可能是无效的数据。

【规则 1-15】不同类型数据之间的运算要注意精度扩展问题,一般低精度数据将向高精度

数据扩展。

sizeof:sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。

sizeof(int) *p的意思是sizeof(int)的值乘于p

int a[100] sizeof(a) = 400 sizeof(&a) = 400 sizeof(&a[0]) = 4

&a不是指向指针的指针,因为&a和a的值相等,但是*&a和*a的值不相等。*&a和a的值一样,说明*&a仅仅是对这个数组指针进行了取值,取得的是数组的值,即数组首元素的地址,而不是对&a这个地址进行了取值。这个应该是c语言中针对数组指针运算的规定。

Signed + unsigned = unsigned

空指令尽量用NULL;而不是一个分号;要让人知道这里不执行如何操作。

【规则 1-17】先处理正常情况,再处理异常情况。

在编写代码是,要使得正常情况的执行代码清晰,确认那些不常发生的异常情况处理

代码不会遮掩正常的执行路径。这样对于代码的可读性和性能都很重要。

case 后面只能是整型或字符型的常量或常量表达式

【规则 1-21】按字母或数字顺序排列各条 case 语句。

【规则 1-22】把正常情况放在前面,而把异常情况放在后面。

【规则 1-23】按执行频率排列 case 语句

【规则 1-24】简化每种情况对应的操作。

continue语句只用在for、while、do-while等循环体中, 常与if条件语句一起使用, 用来加速循环。不能应用在switch中。

【规则 1-34】如果函数无参数,那么应声明其参数为 void 因为有的编译器无参数可以编译通过

void *pvid; pvoid++;ANSI错误 GNU正确

【规则 1-38】 return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。

return; 在ARM里面返回的r是r0,其它芯片不知道,需要查一下寄存器程序调用规则,

int a = return ; 那么a = r0的值。

const: 定义 const 只读变量,具有不可变性。

case 语句后面是不可以可以是 const 修饰的只读变量

节省空间,避免不必要的内存分配,同时提高效率,(不分配存储空间,是一个编译期间的值)

const 定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define 定义的宏常量在内存中有若干个拷贝。

const int *p; //const 修饰*p,p 是指针, *p 是指针指向的对象,不可变

int const *p; //const 修饰*p,p 是指针, *p 是指针指向的对象,不可变

int *const p; //const 修饰 p, p 不可变, p 指向的对象可变

const int *const p; //前一个 const 修饰*p,后一个 const 修饰 p,指针 p 和 p 指向的对象

都不可变

volatile :const volatile int i= 10;实际上此声明表示的申明了一个const int型的变量,所以i是只读变量,不能被修改。同时i又被volatile修饰了,意思就是说不允许编译器优化代码,在代码中每次用到i时都要直接从内存中去取数。

所以,虽然const volatile int i = 10;定义没错,但是这样的定义没有什么实际的意义。

extern int i; //写成 i = 10;行吗? 全局可以,全局变量默认是extern   局部不行

extern void fun( void);//两个 void 可否省略?可以,函数默认是int

int j = 1; extern double j; //这样行吗?为什么? 可以,extern只是声明

struct: 空结构 sizeof为1;

C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结

构中的柔性数组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可

变的数组。sizeof 返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用

malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组

的预期大小。typedef struct

{

char c;

int a[];

}aa;

sizeof(aa)为4;

union大小端模式判断:

int checkSystem( )

{

union check

{

int i;

char ch;

} c;

c.i = 1;

return (c.ch ==1);

}

const Stu_pst stu3; Stu_pst是类型省略,修饰指针。

编译器用空格代替原来的注释

C语言深度剖析-笔记的更多相关文章

  1. 读书笔记之:C语言深度剖析

    读书笔记之:C语言深度剖析 <C 语言深度解剖>这本书是一本“解开程序员面试笔试的秘密”的好书.作者陈正冲老师提出“以含金量勇敢挑战国内外同类书籍”,确实,这本书中的知识点都是一些在面试中 ...

  2. 《C语言深度剖析》学习笔记----C语言中的符号

    本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...

  3. 指针与数组的区别 —— 《C语言深度剖析》读书心得

    原书很多已经写的很清楚很精炼了,我也无谓做无意义的搬运,仅把一些基础和一些我自己以前容易搞混的地方写一下. 1. 意义: 指针: 指针也是一种类型,长度为4字节,其存放的内容只能是一个地址(4字节). ...

  4. C语言深度剖析-----内存管理的艺术

    动态内存分配 为什么使用动态内存分配 例:记录卖出的商品 卖出商品最多只能记录1000个 两种改进的方法 都需要动态内存分配 第二种方法需要重置内存 calloc和realloc realloc重置内 ...

  5. C语言深度剖析-----函数

    认清函数的真面目 函数的意义 面向过程的程序设计 函数声明和定义 函数参数 编写代码的时候,不要编写类似先后调用的代码 f(k,k++) C语言中的顺序点 a--&&a  ,& ...

  6. C语言深度剖析学习错误点记录

    0. static修饰变量和函数 static修饰变量,1)限定作用域,本文件内.全局变量(自定义起,本文件前面要用需extern声明),局部变量函数内:2)生命周期,程序运行期间一直保存. stat ...

  7. C语言深度剖析---预处理(define)(转载)

    1.数值宏常量     #define宏定义是个演技非常高超的替身演员,但也会耍大牌的,所以我们使用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码都认识宏了:也可以把任何东西都 ...

  8. C语言深度剖析--volatile(转载)

    volatile关键字和const一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统,硬件或者其他线程等等.遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进 ...

  9. C语言深度剖析---const关键字(转载)

    const是constant的缩写,是恒定不变的意思.被const修饰的值,是只读变量. 1.const修饰只读变量,具有不变性      #include <stdio.h> int m ...

随机推荐

  1. BZOJ2300: [HAOI2011]防线修建

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2300 (我只是在发以前写过的题.. 因为题目没说强制在线,所以离线乱搞就可以了.先把点删掉然后 ...

  2. ThinkPHP3.2基础知识(二)

    1.单入口模式的好处: 安全,灵活.可集中进行安全处理,访问统计等统一控制. 2.入口文件中为什么要判断PHP版本,TP要求PHP的版本是什么? 因为ThinkPHP3.2版本只能在PHP版本5.3. ...

  3. Myeclipse2014 已有项目更换JDK

    原先项目使用JDK是1.7,今天项目加入了一个新包,只支持JAVA8,让我们都升级一下本地的JDK,我突然发现我还没有在myeclipse上升级过JDK呢.捣鼓了一下,也不难,记录一下. 1.下载ja ...

  4. [国嵌笔记][023][ARM寻址方式]

    寻找方式 1.处理器根据指令中给出的信息来找到指令所需操作数的方式 2.立即数寻址 操作数本身在指令中给出,立即数前加”#”表示立即数寻址,操作数在指令中 3.寄存器寻址 利用寄存器中的数值作为操作数 ...

  5. git生成sshkey

  6. destoon标签

    http://blog.csdn.net/oYuHuaChen/article/details/54601509 ------------

  7. Selenium自动化测试脚本中三种等待时间简介

    为了提高脚本的稳定性,我们需要在脚本中增加等待时间 第一种:强制等待 Thread.sleep():固定休眠时间设置,Java的Thread类里提供了休眠方法sleep,导入包后就能使用 sleep( ...

  8. python3 第二十章 - 函数式编程之Higher-order function(高阶函数)

    什么是高阶函数?把函数作为参数传入或把函数做为结果值返回,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式.函数式编程的特点: 函数本身可以赋值给变量,赋值后变量为函数: 允许将函数本身 ...

  9. 嵌入式QT移植

    1  开发环境 目标版:FS4412(Cortex-A9)开发板 交叉工具链:arm-linux-gcc 4.6.4 版本 Qt:qt-everywhere-opensource-src-5.4.2. ...

  10. Linux指令--chgrp

    在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...