- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
重学C语言
重学C语言
1、简述 1
2、一些真相 2
3、C缺陷 3
3.1多做之过 3
3.1.1Switch语句 3
3.1.2相邻字符串常量的自动连接 3
缺省情况下函数名字的全局可见性 3
3.2 误做之过 4
3.2.1符号重载 4
3.2.2 复杂的运算符优先级规则 4
3.3少做之过 5
3.3.1 空格的作用 5
3.3.2一些代码能轻松通过编译,但运行起来就是垃圾 5
4、C语言声明 6
4.1 C语言声明概述 6
4.2 C语言中的组合类型声明 6
4.3 C语言声明分析 7
5、指针与数组 8
5.1 数组与指针的异同 8
5.2 二维数组 8
6、数组传参 9
1、简述
C语言作为我平时用的最多的一门编程语言,时常感觉用的不那么得心应手,除去标准C库,就其语言本身而言,还有若干盲区。如果你只会用一些逻辑语句,不会用指针操作内存、不会用头文件整理工程、看不明白C语言声明,混淆传参过程,甚至连运算符的优先级都搞不清楚,再熟练也只能说知道C语言的一点皮毛,真正的精髓是指针,当然也是难点。不容易理解的地方包括指针与数组、声明、函数传参。距初学C语言四年后,重新学习,查缺补漏,幸得好书一本《C专家编程》,站在更高的地方审视C语言的好与坏,精髓与学习之道,收获颇丰,码出一些笔记跟大家交流。
可以把语言看成一门协议,最初的设计是有其背景的,协议有好有坏,性能不可能是最佳的,语言也是,标准化以后的ANSI C语言有它的优点,也有它“难以忍受”的缺点,当然,即使是缺点,也不会再优化,不然新的编译器将会使以前无数正常的代码出现令coder莫名其妙的bug。站在历史的、设计者的角度重新学习,而不是去抠具体的知识点,那种豁然开朗的感觉真好。就像搞嵌入式没听说过startup.s,做ARM不明白bootloader内容,玩51不知道idata、xdata,写工程不懂模块化没听说过链接描述文件,有些真相你如果接触不到,你就永远都是业余选手。
2、一些真相
1、根据C语言的设计哲学,它排斥强类型,允许程序员在需要时可在不同的类型对象之间赋值,许多C程序员仍然认为“强类型”不过是敲击键盘的无用功。ANSI C规定:执行算术运算时,操作数类型如果不同,就会发生转换,数据类型朝着浮点精度更高、长度更长的方向转换,如果整数转换为signed不会丢失信息则会转成signed,否则转换为unsigned。也就是采用值保留原则(value preserving)把几个整数操作数混在一起使用,结果类型可能是有符号数也可能是无符号数,取决于操作数的相对大小
2、C语言的很多特性在设计之初是为了方便编译器的设计者,比如其下标从0开始、比如表达式中的数组名可以看做是指针,比如用register关键字来定义热门变量,放在寄存器里存储。
3、typedef与#define的区别。后者是宏定义,最好只用于命名常量,并为一些适当的结构提供简记,宏名称应该大写,这样便容易与函数调用区分开来。Typedef是类型定义,它是一种有趣的声明形式,它为类型引入新的名字而不是为变量分配空间,类似于宏定义但又有关键性的区别。Typedef一般用于简法表示指向其它东西的指针,如:typedef char * string;。它与宏定义有两点关键区别:
可以用其它类型声明符对宏类型进行扩展,但typedef定义的类型则不能
#define peach int
unsigned peach i ; //no problem
typedef int banana;
unsigned banana i ; //it is wrong!
在连续的几个变量声明中,用type可以保证所有变量均为同一类型,而用宏定义则没有办法保证
#define int-ptr int *
int-ptr a,b;
经过宏扩展后,变为int *a,b ,b就变成整型了。
Typedef有几个使用原则,它应该用在数组指针及函数的组合类型定义中,而且不要为了方便起见对结构使用typedef,那样唯一的好处就是省去了struct,但是也省去了它的提示作用,不利于程序的可读性。
Typedef之所以被称为存储类型符,只是为了语法上更加方便而已。
4、应该去阅读ANSI C标准,从中寻找乐趣与裨益。ANSI C标准6.3.2.2节,每个实参都应该有自己的类型,这样它的值经过实参与形参的一致性检验后就可以赋给形参。也就是说传参类似于赋值,所以如果写一个交换值的小函数,不应该直接传值,而是传递指针。
5、关于指针赋值。指针赋值有两个原则:一个是两个操作数都是指向有限定符或者无限定符的相容类型。另一个,左侧指针指向的类型必须具有右侧指针指向类型的全部限定符。
Char *cp;
Const char *cpp;
Cpp=cp;
而
文档评论(0)