C的那些事儿

Posted trav

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C的那些事儿相关的知识,希望对你有一定的参考价值。

一、前言

本文收录了作者在看书、学习、编程的经历中收获的一些经验,我将其命题为C的那些事儿,记录C语言的编程哲学。

二、正文

auto 关键字显然是摆设

这个关键字只对创建符号表入口的编译器设计者有意义。它的意思是“在进入程序块时自动进行内存分配“。其他程序员不必操心 auto 这个关键字,它是缺省的变量内存分配方式。

表达式中的数组名可以看作是指针

把数组当作指针,简化了很多东西。我们不在需要一种复杂的机制区分它们,把它们传递到一个函数时不必忍受必须复制所有数组内容的低效率。不过,数组和指针并不是在任何情况下都是等效的。

不允许嵌套函数

这简化了编译器,并稍微提高了C程序的运行时组织结构。

register 关键字 - 失误的设计

这个关键字能给编译器设计者提供线索,就是程序中哪些变量是热门,这样就可以把它们放入寄存器中。这个设计可以说是一个失误,如果让编译器在使用各个变量的时候自动处理寄存器的分配工作,显然比一经声明就把这类变量在生命期内始终保留在寄存器里要好。使用 register 关键字,简化了编译器,却把包袱丢给了程序员。

大写

谨慎使用无符号数

尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。比如:不论是在 ANSI C 和 K&R C 中,在这样一段代码

int a = -1;
int b[] = {1, 2, 3};
#define TOTAL_ELEMENTS ( sizeof(b) / sizeof b[0] )
if( a < TOTAL_ELEMENTS )
  printf("See u no time
");

if 语句比较的两个类型分别为有符号、无符号类型,其中的 -1 会安静的升级为无符号类型,意外的变成一个巨大的整数,这将使得判断语句为假。
所以,不要仅仅因为无符号数不存在负值(如年龄、国情)而用它来表示数量。取而代之的是,更建议使用像 int 那样的有符号类型,可以避免出现一些复杂而麻烦的意外情况。

持续更新


以上是关于C的那些事儿的主要内容,如果未能解决你的问题,请参考以下文章

Java代码的编译与反编译那些事儿

Java代码的编译与反编译那些事儿

JavaScript 中对变量和函数声明的“提前(hoist)”的那些事儿

C的那些事儿

开发那些事儿:Go加C.free释放内存,编译报错是什么原因?

GCD那些事儿