- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
“C专家编程》读笔记[1)
HYPERLINK /LShang/archive/2011/12/08/LShang.html《C专家编程》读书笔记(一)
By:LShang
Blog:HYPERLINK /LShang/LShang
C 语言的发展
1965-7(BCPL)-1969(B)-1971(New B)-1972-3(早期的C)-1976-9(KC)-1983-9(ANSI C)-
C 的许多特性是为了方便编译器设计者而建立的
数组下标从0开始(定义数组a[100]的合法范围是a[0] ~ a[99])
基本数据类型直接与底层硬件对应
auto关键字只对创建符号表入口的编译器设计者有意义(进入程序块时自动分配内存)
表达式中的数组名可以看作是指针(并非永远如此)
float会被自动扩展为double(仅在最初如此,ANSI C不再如此)
不允许嵌套函数(函数内部不允许包含另一个函数的定义)
register关键字(可以提供程序中的热门变量,使之将其存放到寄存器中。)
关于register关键字,??中说
“这个设计可以说是一个失误,如果让编译器在使用各个变量时自动处理寄存器的分配工作,显然比一经声明就把这类变量在生命期内始终保留在寄存器里要好。使用register关键字,简化了编译器,却把包袱丢给了程序员。”
C 编译器不曾实现的一些功能必须通过其他途径实现:
标准 I/O 库和 C 预处理器
最早的可移植 I/O 库出现在1972年,由 Mike Lesk 编写
C 预处理器主要实现三个功能
字符串替换
头文件包含
通用代码模板的扩展(宏)
宏的实际参数只按照原样输出。
在宏的扩展中,空格会对扩展的结果造成很大影响。
#define a(y) a_expanded(y)a(x)//被扩展为a_expanded(x);//而#define a (y) a_expanded(y)//则被扩展为(y) a_expanded (y)(x);
HYPERLINK javascript:void(0);复制代码
书中建议:
宏最好只用于命名常量,并为一些适当的结构提供简捷的记法。
宏名应该大写,这样便容易与函数名区分
千万不要使用 C 预处理器来修改语言的基础结构,因为这样 C 就不再是 C
KR C 和 ANSI C
1978年,《The C Program Language》一书出版,其作者 Brian Kernighan 和 Dennis Ritchie 名声大噪。这个版本的 C 被称为 KR C
1983年,美国国家标准化组织(ANSI)成立了 C 语言工作小组,开始了 C 语言的标准化工作
1989年12月,ANSI委员会接受了 C 语言标准草案,随后国际标准化组织 ISO 也接纳了 ANSI C 标准(C 89标准)
1990年初,ANSI 重新采纳了 ISO C(删除掉了Rationale一节),所以原则上说日常所说的标准 C 应是 ISO C 而不是 ANSI C
KR C 和 ANSI C 的区别
函数原型的增加
关键字的增加
安静的改变
其他区别
原型是函数声明的扩展,这样不仅函数名和返回类型已知,所有形参类型也是已知的
参数传递的过程类似于赋值
每个实参都应该具有自己的类型,这样它的值就可以赋值给与它所对应的形参类型的对象(该对象的类型不能含有限定符)
参数传递时的相容与不相容
char *cp;constchar *ccp;ccp = cp;//可以相容
HYPERLINK javascript:void(0);复制代码
char * 是一个指向没有限定符的 char 型指针
const char * 是一个指向有 const 限定符的 char 型指针
char 类型与 char 类型可以相容,左操作数(形参)具有右操作数(实参)所指向类型的限定符(无限定符),再加上自身的限定符(const)。
char *cp;constchar *ccp;cp = ccp;//不可以相容
HYPERLINK javascript:void(0);复制代码
char * 是一个指向没有限定符的 char 型指针
const char * 是一个指向有 const 限定符的 char 型指针
char 类型与 char 类型可以相容,左操作数(形参)不具有右操作数(实参)所指向类型的限定符(const)
测试代码
#include stdio.hint main(){char *cp = {By LShang};constchar *ccp = cp; printf(%s\n,ccp);return0;}
HYPERLINK javascript:void(
文档评论(0)