C诡异离奇,缺陷重重,却获得了巨大的成功.
编译器设计者的金科玉律:
效率几乎就是一切。
C语言根据编译器设计者的思路而发展形成的语言特性:*
- 数组下标从0而不是从1开始
- C语言的基本数据类型直接与底层硬件相对应 auto关键字显然是摆设(auto:在进入程序块时自动进行内存分配)
- 表达式中的数组名可以看作是指针
- float被扩展为double
- 不允许嵌套函数(函数内部包含另一个函数的定义)
- register关键词 将变量存放在寄存器中
C预处理器实现的3个主要功能:
- 字符串替换:通常用于为常量提供一个符号名。
- 头文件包含:一般性的声明可以被分离到头文件中,并且可以被许多源文件使用
- 通用代码模板的扩展。
- 宏的扩展中,空格对扩展的结果造成很大的影响。
宏最好只用于命名常量,并为一些适当的结构提供简捷的记法。宏名应该大写。千万不要使用C预处理器来修改语言的基础结构。
ANSI C中最重要的特性就是“原型”,这种特性取自C++。原型是函数声明的扩展,函数名、返回类型、形参类型都是已知的。这就允许编译器在参数的使用和声明之间检查一致性。
- 原型的目的:当我们对函数作前向声明时,在形参类型中增加一些信息。
赋值的约束条件之一:两个操作符都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向的全部限定符。
char *cp;
const char *ccp;
ccp = cp;
- 左操作数是一个指向有const限定符的char的指针。
- 右操作符是一个指向没有限定符的char的指针。
- char类型与char类型是相容的,左操作符所指向的类型具有右操作符所指向类型的限定符(无),再加上自己的限定符(const)。
1. const float*类型并不是一个有限定符的类型——它的类型是“指向一个具有const限定符的float类型的指针”,也就是const限定符是修饰指针所指向的类型,而不是指针本身。
**2.const char 是指向有const限定符的char类型的指针的指针。
容易混淆的const
- 关键词const并不能把变量变成常量。在一个符合前加上const限定符只是表示这个符合不能被赋值。它的值对于这个符合来说是只读的,但它不能防止通过程序的内部(甚至是外部)的方法来修改这个值。const最有用之处就是用它来限定函数的参数,这样该函数将不会修改实参指针所指的数据。
- const和*的组合通常值=只用于在数组形式的参数中模拟传值调用。它声称“我给你一个指向它的指针,但你不能修改它。”通常被限制于把指针从一种类型转换为另一个类型。
对无符号类型的建议:
- 尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。
- 尽量使用像int那样有符号类型。
- 只有在使用位段和二进制掩码时,才可以用无符