c语言常见的小错误..docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1、用if(!strcmp(s1, s2)) 比较两个字符串等值,是否是个好风格?   这并不是个很好的风格,? 虽然这是个流行的习惯用法。如果两个字符串相等,   这个测试返回为真, 但! (“非”) 的使用, 容易引起误会,? 以为测试不等值情况。   另一个选择是用一个宏:   #define Streq(s1, s2) (strcmp((s1),? (s2)) == 0)   2、为什么有的人用if (0 == x) 而不是if (x ==? 0)?   这是用来防护一个通常错误的小技巧:   if (x = 0)   如果你养成了把常量放在== 前面的习惯,? 当你意外的把代码写成了:   if (0 = x)   那编译器就会报怨。明显的, 一些人会觉得记住反换测试比记住输入双=? 号容易。当然这个技巧只对和常量比较的情况有用。   3、*p++ 自增p 还是p 所指向的变量?   后缀++ 和--? 操作符本质上比前缀一目操作的优先级高,即++与p结合优先级高于*与p的结合优先级, 因此*p++ 和*(p++) 等价, 它自增p 并返回p? 自增之前所指向的值(也即先去内容,然后指针p才自加)。要自增p 指向的值, 使用(*p)++,? 如果副作用的顺序无关紧要也可以使用++*p.   4、我有一个char * 型指针正巧指向一些int 型变量,? 我想跳过它们。为什么如下的代码((int *)p)++; 不行?   在C 语言中, 类型转换意味着“把这些二进制位看作另一种类型,? 并作相应的对待”; 这是一个转换操作符, 根据定义它只能生成一个右值(rvalue)。而右值既不能赋值, 也不能用++ 自增。(如果编译器支持这样的扩展,? 那要么是一个错误, 要么是有意作出的非标准扩展。) 要达到你的目的可以用:   p = (char *)((int *)p + 1);或者,因为p? 是char * 型, 直接用p += sizeof(int);   但是, 在可能的情况下, 你还是应该首先选择适当的指针类型,? 而不是一味地试图李代桃僵。   5、C 有“按引用传递” 吗?   真的没有。   严格地讲, C? 总是按值传递。你可以自己模拟按引用传递, 定义接受指针的函数, 然后在调用时使用 操作符。事实上, 当你向函数传入数组(传入指针的情况参见问题6.4? 及其它) 时, 编译器本质上就是在模拟按引用传递。但是C 没有任何真正等同于正式的按引用传递或C++ 的引用参数的东西。另一方面,? 类似函数的预处理宏可以提供一种“按名称传递”的形式。   6、我们经常说空指针,那么那个“臭名昭着”的控制振动到底是什么呢?   语言定义中说明,? 每一种指针类型都有一个特殊值-- “空指针” -- 它与同类型的其它所有指针值都不相同, 它“与任何对象或函数的指针值都不相等”.也就是说,? 取地址操作符 永远也不能得到空指针,同样对malloc() 的成功调用也不会返回空指针, 如果失败, malloc() 的确返回空指针,? 这是空指针的典型用法:表示“未分配” 或者“尚未指向任何地方” 的指针。空指针在概念上不同于未初始化的指针。空指针可以确保不指向任何对象或函数;? 而未初始化指针则可能指向任何地方。如上文所述, 每种指针类型都有一个空指针, 而不同类型的空指针的内部表示可能不尽相同。尽管程序员不必知道内部值,? 但编译器必须时刻明确需要那种空指针, 以便在需要的时候加以区分。既然如此,那么怎样在一个程序里面获得一个空指针呢?   根据语言定义,? 在指针上下文中的常数0 会在编译时转换为空指针。也就是说, 在初始化、赋值或比较的时候, 如果一边是指针类型的值或表达式, 编译器可以确定另一边的常数0? 为空指针并生成正确的空指针值。因此下边的代码段完全合法:   char *p = 0;   if(p !=? 0)   然而,? 传入函数的参数不一定被当作指针环境,因而编译器可能不能识别未加修饰的0“表示”指针在函数调用的上下文中生成空指针需要明确的类型转换,强制把0看作指针。例如,? Unix 系统调用execl接受变长的以空指针结束的字符指针参数它。应该如下正确调用:execl(“/bin/sh”, “sh”, “-c”,? “date”,(char *)0);   如果省略最后一个参数的(char *) 转换, 则编译器无从知道这是一个空指针,从而当作一个0? 传入。(注意很多Unix 手册在这个例子上都弄错了。)如果范围内有函数原型, 则参数传递变为“赋值上下文”, 从而可以安全省略多数类型转换,? 因为原型告知编译器需要指针, 使之把未加修饰的0? 正确

文档评论(0)

dashewan + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档