C语言编程常见错误
- 忘记定义变量:程序中使用的每一个变量都必须定义其类型,否则无法为变量分配存储空间。
- 数据类型与指定的输入输出格式不符:输入输出的数据的类型与用户指定的输入输出格式声明不一致。
- 未注意
int
和short int
数据的取值范围。 - 使用 函数
scanf
时,未使用变量的地址符&
。需要指明“向哪个地址所标识的单元送值”。 - 输入数据的形式与要求不符:
scanf
函数中格式字符串中,除了格式说明符以外的字符必须原样输入。 - 在使用
scanf
函数向字符数组输入数据时,在数组名前多加了地址符&
。数组名本身就是代表数组的首地址。 - 在使用
scanf
函数向数值型数组输入数据时,误用数值型数组名。因为输入的是多个数据,必须分别通过指定的数组元素输入。(for
循环 结合&a[i]
) - 语句后面漏写了分号:不是所有的编程语言的语句末尾都有分号,但是 C语言的语句末尾必须有分号,因为分号是 C语句必不可少的一部分。
- 把预处理指令当做 C语句,而错误地在末尾加了分号。预处理指令不是 C语句,在指令后面不应该加分号。
- 在 控制语句(
if、for、while
等)中也不要乱加分号。 - 应该有花括号的复合语句,没有加花括号。
- 括号不配对:当一个语句中使用了多层括号时应保证括号正确配对。
- 标识符应区分大小写。
- 区分关系运算符“
==
”和赋值运算符“=
”。 - 对数组的定义或引用数组元素都要使用方括号。
- 防止数组下标越界,注意数组下标是从 0 开始的。所以最大下标是:
数组长度-1
。 - 定义和引用二维数组和多维数组时,必须将每一维的数据分别用方括号括起来。
- 数组名并不代表数组中全部元素,仅代表数组的首元素地址,因此,要把一个数组赋值给另一个数组,需要使用循环将原数组的每一个元素都复制到新数组中去。
- 区分字符数组和字符指针。字符数组名仅代表数组首地址,而字符指针是指向字符数据的指针变量。
- 在引用指针之前没有给它赋予确定的值。
- switch语句的各分支中不应该漏写 break 语句。
- 区分字符和字符串:字符单撇号,字符串双撇号。
- 使用自增(
++
)和自减(--
)运算时应避免歧义性,拿不准就加括号。i++
是“后自加”,即先取变量i
的值再进行自增。 - 忘记对所调用的函数进行函数原型声明。(编译出错)
- 函数声明与函数定义不匹配:函数类型不能漏写且应匹配,参数类型、数目和顺序都要匹配。
- 在需要加头文件时没有用
#include
指令包含相关的头文件。 - 误认为函数形参值的改变会影响实参的值。(值传递是实参向形参传递数据,单向传递)
- 函数的实参和形参类型不一致。(编译警告,运行结果不符合预期)
- 混用了不同类型的指针。(编译警告,指向不同类型的指针间的赋值必须进行类型转换,比如给一个struct 变量分配存储单元时)
- 应注意系统对函数参数的求值顺序的处理方法。函数求值的顺序到底是从左到右还是从右往左,与编译环境有关,C标准并没有规定。多数情况下从左到右求解和从右到左求解结果是相同的。但是,仍旧有会引起二义性的可能。因此应该保证程序在不同的编译环境下具有相同的运行结果,以使程序更通用。
- 区分数组名和指针变量。
- 区分结构类型和结构变量,只能对一个结构变量赋值,而不能对结构类型(派生的数据类型)赋值,类型不占存储单元,需要分配存储单元的是变量。
- 使用文件时忘记打开,或打开方式与使用情况不匹配。
- 在打开文件时,指定的文件名找不到。
- 忘记关闭文件:虽然系统会自动关闭所用文件,但是可能导致数据丢失。因此,用完文件后必须关闭。