网站大量收购闲置独家精品文档,联系QQ:2885784924

c缺陷和陷阱.pdf

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c缺陷和陷阱

 0 简介  1 词法缺陷  1.1 = 不是 ==  1.2 和 | 不是 和 ||  1.3 多字符记号  1.4 例外  1.5 字符串和字符  2 句法缺陷 2.1 理解声明  2.2 运算符并不总是具有你所想象的优先级  2.3 看看这些分号!  2.4 switch 语句  2.5 函数调用  2.6 悬挂else 问题  3 连接 3.1 你必须自己检查外部类型  4 语义缺陷 4.1 表达式求值顺序  4.2 、||和!运算符  4.3 下标从零开始  4.4 C 并不总是转换实参  4.5 指针不是数组  4.6 避免提喻法  4.7 空指针不是空字符串  4.8 整数溢出  4.9 移位运算符  5 库函数 5.1 getc()返回整数  5.2 缓冲输出和内存分配  6 预处理器 6.1 宏不是函数  6.2 宏不是类型定义  7 可移植性缺陷 7.1 一个名字中都有什么?  7.2 一个整数有多大?  7.3 字符是带符号的还是无符号的?  7.4 右移位是带符号的还是无符号的?  7.5 除法如何舍入?  7.6 一个随机数有多大?  7.7 大小写转换  7.8 先释放,再重新分配  7.9 可移植性问题的一个实例  8 这里是空闲空间  参考  脚注 0 简介 C 语言及其典型实现被设计为能被专家们容易地使用。这门语言简洁并附有表达力。但有 一些限制可以保护那些浮躁的人。一个浮躁的人可以从这些条款中获得一些帮助。 在本文中,我们将会看到这些未可知的益处。正是由于它的未可知,我们无法为其进行完 全的分类。不过,我们仍然通过研究为了一个C 程序的运行所需要做的事来做到这些。我们 假设读者对C 语言至少有个粗浅的了解。 第一部分研究了当程序被划分为记号时会发生的问题。第二部分继续研究了当程序的记号 被编译器组合为声明、表达式和语句时会出现的问题。第三部分研究了由多个部分组成、分 别编译并绑定到一起的C 程序。第四部分处理了概念上的误解:当一个程序具体执行时会发 生的事情。第五部分研究了我们的程序和它们所使用的常用库之间的关系。在第六部分中, 我们注意到了我们所写的程序也许并不是我们所运行的程序;预处理器将首先运行。最后, 第七部分讨论了可移植性问题:一个能在一个实现中运行的程序无法在另一个实现中运行的 原因。 1 词法缺陷 编译器的第一个部分常被称为词法分析器(lexical analyzer )。词法分析器检查组成程序的 字符序列,并将它们划分为记号(token )一个记号是一个由一个或多个字符构成的序列,它 在语言被编译时具有一个(相关地)统一的意义。在C 中, 例如,记号- 的意义和组成它的 每个独立的字符具有明显的区别,而且其意义独立于- 出现的上下文环境。 另外一个例子,考虑下面的语句: if(x big) big = x; 该语句中的每一个分离的字符都被划分为一个记号,除了关键字if 和标识符big 的两个实例。 事实上,C 程序被两次划分为记号。首先是预处理器读取程序。它必须对程序进行记号划 分以发现标识宏的标识符。它必须通过对每个宏进行求值来替换宏调用。最后,经过宏替换 的程序又被汇集成字符流送给编译器。编译器再第二次将这个流划分为记号。 在这一节中,我们将探索对记号的意义的普遍的误解以及记号和组成它们的字符之间的关 系。稍后我们将谈到预处理器。 1.1 = 不是 == 从Algol 派生出来的语言,如Pascal 和Ada ,用:=表示赋值而用=表示比较。而C 语言则是 用=表示赋值而用==表示比较。这是因为赋值的频率要高于比较,因此为其分配更短的符号。 此外,C 还将赋值视为一个运算符,因此可以很容易地写出多重赋值(如a = b = c ),并且 可以将赋值嵌入到一个大的表达式中。 这种便捷导致了一个潜在的问题:可能将需要比较的地方写成赋值。因

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档