cat writebug.cn/history

一个开发者的技术博客。

C语言深度解剖

register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。 而且 register 变量可能不存放在内存中,所以不能用取址运算符“&”来获取 register 变量的地址。   static 静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用 extern 声明也没法 使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些 代码行也不能使用它。想要使用就得在前面再加 extern ***。恶心吧?要想不恶心,很简单, 直接在文件顶端定义不就得了。

静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他 函数也用不了。由于被 static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结 束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。

函数前加 static 使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。   关键字 static 有着不寻常的历史。起初,在 C 中引入关键字 static 是为了表示退出一个 块后仍然存在的局部变量。随后,static 在 C 中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用 static 关键字来表示这第二种含义。     对在多个文件之间共同使用的全局变量或函数要加范围限定符(建议使用模块名 (缩写)作为范围限定符)。(GUI_ ,etc)    特别注意的就是 1(数字 1)和 l(小写字母 l)之间,0(数字 0)和 o (小写字母 o)之间的区别

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

float 变量与“零值”进行比较的 if 语句怎么写?    同样的也不要在很大的浮点数和很小的浮点数之间进行运算   一般来说习惯上用 n,m,i,j,k 等表示 int 类型的变量;c,ch 等表示字符类型变量;a 等表 示数组;p 等表示指针。当然这仅仅是一般习惯,除了 i,j,k 等可以用来表示循环变量外,别 的字符变量名尽量不要使用。 

程序中不得出现仅靠大小写区分的相似的标识符。

定义变量的同时千万千万别忘了初始化。定义变量时编译器并不一定清空了 这块内存,它的值可能是无效的数据。

case 后面只能是整型或字符型的常量或常量表达式(想想字符型数据在内存里 是怎么存的   有时候,你只剩下了最后一种情况需要处理,于是就决定把这种情况用 default 子句来 处理。这样也许会让你偷懒少敲几个字符,但是这却很不明智。这样将失去 case 语句的标 号所提供的自说明功能,而且也丧失了使用 default 子句处理错误情况的能力。     在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放 在最外层,以减少 CPU 跨切循环层的次数   长循环在最内层,效率高

当循环嵌套超过 3 层,程序员对循环的理解能力会极大的降低。

void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:

在 C 语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理

在 C 语言中,可以给无参数的函数传送任意类型的参数, 但是在 C++编译器中编译同样的代码则会出错 无论在 C 还是 C++中,若函数不接受任何参数,一定要指明参数为 void。  

要求余数与被除数的正负号相同