(企业诊断)诊断错误及其处理.pdf

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(企业诊断)诊断错误及 其处理 三、 “悬挂”else 错误及其处理 这个问题并非 C 语言所独有,也已经为人熟知,但即使是有经验的 C 程序员, 也常常在此失误。如果想实现当 x 分别是大于 0 、等于0 和小于 0 时 y 值分别取 得 1 、0 和-1 。考虑下面的程序片段: y=0; if(x>=0) if(x>0)y=1; elsey=-1; 然而,这段代码实际上所做的与编程者的愿望相去甚远。原因在于 C 语言中 有这样的规则,else 总是与同一对括号内最近的未匹配的 if 结合。如果我们按 照上面这段程序实际上被执行的逻辑来调整代码缩进,大致是这样: y=0; if(x>=0) if(x>0)y=1; elsey=-1; 也就是说,并非是当 x<0 时y=-1 ,而是当x=0 时也使y=-1 。 解决这一问题我们可以用“封装”的办法,将上述程序改为: y=0; if(x>=0) {if(x>0)y=1;} elsey=-1; 现在,else 与第一个 if 结合,即使它离第二个 if 更近也是如此,因为此时第二 个 if 已经被括号“封闭”起来了。 四、整数溢出及其处理 C 语言为编程者提供了三种不同长度的整数:shortint 、int 和 longint ,但 不管是哪种类型表示的整数总有一定的范围,越出该范围时称为整数的溢出。例 如现有算法要求如下:求满足条件 1+2+3+…+n≤32767 的最大整数n ,请考察如 下程序段: intn=1,sum=0; while(sum<=32767){sum+=n;n++;} printf(“n=%d\n”,n-1); 乍看该程序时无错误,但事实上,上列程序中的 while 循环是一个无限循环, 原因在于 int 型数的表示范围为-32768 到+32767 ,当累加和sum 超过 32767 时, 便向高位进位,而对 int 型数而言,最高位表示符号,故 sum 超过 32767 后便得 到一个负数,while 条件当然满足,从而形成无限循环。此时,最好的解决办法 是将 sum 定义为 longint 型。 五、词法陷井及其处理 (1)=不同于== 这是初学者最易犯的一个错误,符号=作为赋值运算符,符号==作为比较。一 般而言,赋值运算相对于比较运算出现得更频繁,因此,字符数少的符号=就被 赋予了更常用的含义――赋值运算。此外,在 C 语言中赋值符号被作为一种操作 符对待,因而重复进行赋值运算(如 a=b=c=5)可很容易地书写,并且赋值操作 还可以嵌入到更大的表达式中。这种使用上的便利性可能导致一个潜在的问题: 本意是作比较运算时,却可能无意中误写成了赋值运算。该错误大多数情况下可 以通过简单的要素项重排而防止。从编译器的角度出发,对于相等测试,变元在 等号的哪一边无关紧要,如果两边都是变量,则需要留意符号“=”的个数。但 是,如果一边是常量,则存在可以防止错误的适当措施。我们何不养成把常量放 在比较运算符左边的习惯呢?因为这样一来,即便漏掉了一个“=”符号,保证 会出现一个编译错误,因为不能给常数赋值。 (2)字符与字符串 C 语言中的单引号和双引号含义迥异,用单引号引起的一个字符实际上代表一个 整数,整数值对应于该字符在编译器采用的字符集中的序列值,因此,采用ASCII 字 符集的编译器而言,‘a’的含义与0141 或97 严格一致。而用双引号引起的字符串, 代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个 额外的二进制值为零的字符 ‘\0’初始化。 整型数(一般为 16 位或 32 位)的存储空间中可以容纳多个字符(一般为 8 位),因此,有的 C 编译器允许在一个字符常量(以及字符串常量)中包含多个 字符。也就是说,用 ‘yes’代替 “yes”不会被编译器检测到,后者的含义是“依 次包含 ‘y’、‘e’、‘s’以及字符 ‘\0’的4 个连续内存单元的首地址”,而前者 的含义并没有正确地定义,有些C 编译器会处理成出错,但大多数 C 编译器的理 解为 “一个整数值,由 ‘y’、‘e’、‘s’所代表的整数值按照特定编译器实现中 定义的方式组合得到”。因此,这两者如果在数值上有什么相似之处,也完全是 一种巧合而已。 (3)整数溢出

文档评论(0)

138****3956 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档