C语言编程陷阱与避坑指南

需积分: 9 3 下载量 26 浏览量 更新于2024-08-02 收藏 143KB DOC 举报
"这篇文档详细探讨了C语言的潜在缺陷和陷阱,旨在帮助程序员避免常见的错误,提升编程技能。文章分为七个部分,涵盖了从词法分析到可移植性问题的各种主题,强调了理解和遵循C语言规则的重要性。" C语言编程中的一些关键知识点包括: 1. **运算符优先级和误用**:C语言使用`=`进行赋值,`==`进行比较。由于赋值操作更常见,因此使用较短的符号。但初学者常混淆两者,导致逻辑错误。同样,`&`和`|`是位运算符,而`&&`和`||`是逻辑运算符,它们在布尔逻辑中起作用,有短路特性。 2. **多字符记号**:根据“最长子串原则”,C语言的词法分析器会尽可能将字符序列识别为最长的记号。这可能导致某些情况下出现意外的行为,比如`a++b`会被解析为两个独立的记号`a++`和`b`,而非一个连续的操作。 3. **组合赋值运算符**:`+=`等组合赋值运算符是两个记号的组合,如`a+=1`等效于`a=a+1`。然而,`p->a`是一个非法的表达式,不能被视为`p->a`的简写。 4. **字符串和字符常量**:字符常量('c')是对应字符的ASCII值,而字符串常量("string")是字符数组,以空字符`\0`结尾。字符常量可以用于整数计算,而字符串常量用于文本存储。 5. **预处理器与编译器**:C程序在编译前先通过预处理器处理,进行宏定义替换等操作。这可能导致源代码的原始形式与最终编译的形式有所不同,程序员需理解这一过程以避免预处理器引发的错误。 6. **可移植性问题**:C语言的实现依赖于不同的编译器和环境,一个程序在一种环境下运行正常,但在另一种环境下可能出错。因此,编写可移植的代码至关重要,需要考虑标准兼容性、头文件的使用、系统调用等差异。 7. **编译器差异**:不同编译器对某些语法的处理可能存在差异,例如,一些旧的编译器可能将`=+`视为单一记号,与`+=`等效,但这是非标准行为,不应依赖此特性编写代码。 在编程C语言时,了解这些细节和陷阱至关重要,因为它们可以帮助开发者编写更加健壮和可维护的代码,同时避免不必要的错误和意外行为。学习C语言不仅需要理解基本语法,还需要深入理解其底层机制,以便更好地控制程序的行为。
2019-09-08 上传
C语言编程注意事项 1. 每个程序中一定包含main()函数, 尽管C语言中对函数命名没有限制。 2. printf函数永远不会自动换行, 只能用\n来实现, 回车键进行的换行在编译中会出现错误信息。 3. 在vs2008等平台中编译、测试要加 system("pause"); 来暂停dos自动退出引起的printf无法显示。 4. 所有自定义变量必须声明才能使用。 5. 每行一般只写一条语句, 在运算符两边加一个空格, 便于阅读。 6. 整数除法将会自动舍位, 不进行四舍五入的操作。 7. for(初始化部分;条件部分;增长部分) 比while 更适用于初始化和增长步长都是单条语句的情况。 8. 使用 #define 名字替换文本对部分"幻数" 赋予意义便于阅读 #define结尾无需;号来结束。 9. EOF(end of file)表示没有字符输入时定义在stdio.h 头文件中 EOF不等于\n 换行等。 10. 由于!= 的优先级大于 = ,因此如果对判断中存在变量赋值时 应对赋值加() 例如: while((c = getchar()) != EOF)。 11. getchar() 用于用户输入直至键入回车键。 12. 变量名以字母和数字组成, (下划线"_"被默认为字符, 以下划线为首写字母的为库类变量名), 变量常以小写字母开头,内部变量名前31位有效, 外部变量名至少前6位保持唯一性。 13.在C语言中是区分字母大小写的。 14. 一个字符常量为一个整数, 用''单引号括起来。例如: '0' 为48, 它与0没有任何关系。 15. ANSI C语言的转义符: \a 响铃符; \b 回退符; \f 换页符; \n 换行符; \r 回车符; \t 横向制表符 ; \v 纵向制表符; \\ 反斜杠; \? 问号; \' 单引号; \" 双引号; \ooo 八进制数; \xhh 十六进制数; '\0' 表示0, 即(null)。 16. 'x'与"x"的区别: 'x'表示一个整数, 字母x在其字符集中对应的数值, "x"表示包含一个字符x 以及一个结束符'\0'。 17. const在声明变量中起限制作用, 该限定变量的值不能被修改。 18. %运算符不能应用于float或double类型。 19. char类型转换为int型时, 因为无法判断它是signed还是unsigned,这样其结果有可能为负数, 所以转换时尽量指定signed和unsigned限制符。 20. ++i与i++ 的不同之处: ++i是先 +1再使用i, i++ 是先使用i再 +1。 21. 三元运算符"?:" 第一个表达式的括号不是必须的, 但是由于三元表达式的优先级非常低, 因此我们还是将第一个表达式用()括起来以便于阅读和理解。 22. C语言中可以使用递归 (即函数调用自身函数), 这样做并不节省储存空间也不加快执行速度, 只是使程序紧凑便于理解。