C专家编程 第一章
第一章 C:穿越时空的迷雾
-
C语言的史前阶段
UNIX比C语言出现的早。
BCPL-->B-->New B-->早期的C
UNIX(PDP-7汇编)-->UNIX(PDP-11汇编)-->UNIX(C语言)
PDP-7-->PDP-11、IBM 360 、Honeywell 635
-
C语言的早期体验
根据编译器设计者的思路发展的特性:
-
数组下标从0而不是1开始
-
C的基本数据类型直接与底层硬件相对应
-
auto关键字是摆设
-
表达式中的数组名可以看作是指针
-
float被自动扩展为double ANSI C不再如此
-
不允许嵌套函数(函数内部包含另一个函数的定义)
-
register关键字
-
-
标准I/O库和C预处理器
C预处理器的主要功能:
-
字符串替换
-
头文件包含
-
通用代码模板的扩展
宏最好只用于命名变量;宏名应该大写;千万不要使用C预处理器来修改语言的基础结构
-
-
K&R C
1972-3 -->1976-9 -->1983-9--->
早期的C-->K&R C -->ANSI C --->
1967 --->1985-9 ----->
Simula 67---->C++---->
-
今日之ANSI C
K&R C-->ANSI C
-
它很棒,但它符合标准吗?
不可移植代码
-
由编译器定义的
-
未确定的
坏代码
-
未定义的
-
约束条件
可移植的代码
-
只使用已确定的特性
-
不突破任何由编译器实现的限制
-
不产生任何依赖由编译器定义的或未确定的或未定义的特性的输出
-
遵循标准的
-
-
编译限制
每个ANSI C必须支持:
-
函数形参上限至少31
-
函数实参上限至少31
-
一条源代码至少509个字符
-
表达式至少32层嵌套的括号
-
long int最大值不小于2147483647(不低于32位)
-
-
ANSI C标准的结构
四个部分:
-
介绍:对术语进行介绍和定义
-
环境:程序启动时发生什么,程序终止时发生什么,以及一些信号和浮点数运算。
-
C语言
-
C运行库
-
-
阅读ANSI C标准,寻找乐趣和裨益
char **和const char **不相容,相信为什么(指针指向的内容是不一样的)
const不能把变量变成常量,只表示这个符号不能被赋值。
- “安静的改变”究竟有多安静
算术转换
- char/short-->int float-->double
- 一个操作数为double,另一个操作数也被转换为double,结果也为double
- 一个操作数为long,另一个也被转换为long,结果也是long
- unsigned类似
字符和整型
- char、short int和int可以使用在int或unsigned int的表达式中。
- 如果int为32位,源类型的值就转换为int,否则转换为unsigned int
寻常算术转换
- 整型升级
*当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点精度更高、长度更长的方向转换,整型数如果转换为signed不会丢失信息,就转换为signed,否则转换为unsigned*
尽量不要在代码中使用无符号类型,只有在位段和二进制掩码时,才可以使用无符号数
- 由编译器定义的Pragmas效果
受到gcc抵制,若用gcc编译会运行计算机游戏。