C语言程序设计之常见错误分析
- 1、书写标识符时,忽略大小写字母的区别
- 2、忽略了变量的类型,进行了不合法的运算
- 3、将字符常量与字符串常量混淆
- 4、忽略了 "=" 与 "==" 的区别
- 5、忘记加分号或多加分号
- 6、输入变量时忘记加地址运算符 “&” 或在不应加 “&” 的位置加了地址运算符
- 7、输入数据的方式与要求格式不符
- 8、输入字符的格式与要求不一致
- 9、输入输出的数据类型与所用格式说明符不一致
- 10、输入数据时,企图规定精度
- 11、switch语句中漏写 break语句
- 12、在定义数据时,将定义的 “元素个数” 误认为是可使用的最大下标
- 13、自增(++),自减(--)运算符的使用
- 14、if 与 else 的匹配问题
- 15、“\” 和 “/” 的混淆
- 16、C语言关键字的拼写
- 17、在做改错题时要注意数字与拼音的区别
1、书写标识符时,忽略大小写字母的区别
c语言认为大写字母和小写字母是两个不同的字符,如在编译程序过程中,系统会把 a 和 A 看作是两个不同的变量名。习惯上,符号常量名用大写表示,变量名用小写表示,以增加程序的可读性。
2、忽略了变量的类型,进行了不合法的运算
main(){
float a=3.4, b=0.4;
printf("%d", a%b);
}
% 是求余运算,得到 a/b 的余数。整型变量 a 和 b 可以进行求余运算,而实型变量则不允许进行 “求余”运算。
3、将字符常量与字符串常量混淆
char c;
c = “a”;
这里就是混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。
C语言规定以 ‘\0’ 作为字符串结束标志,它是由系统自动加上的,所以字符串 “a” 实际上包含两个字符:‘a’ 和 ‘\0’,而把它赋给一个字符变量是不行的。
4、忽略了 “=” 与 “==” 的区别
C语言中,“=” 是赋值运算,“==” 是关系运算符。例如:
if(a==3) a=b;
前者是进行比较,a 是否和 3 相等;后者表示如果 a 和 3 相等,把 b 的值赋给变量 a。由于习惯问题,我们往往会犯这样的错误:
if(a=3) a=b;
结果 a 总是等于 b 的值,原因是条件 a=3 是给 a 赋值 3,判断条件非 0 ,总是执行 a=b。
5、忘记加分号或多加分号
分号是 C 语句中不可缺少的一部分,语句末尾必须有分号,但也不能乱加。例如:
#include<stio.h>
float fun(int n)
{
}
void main(void){
int n;
float s;
printf("\nPlease enter N : ");
scanf("%d", &n);
s = fun(n);
printf("The result is : %f\n", s);
}
这是一个函数调用,在函数首部 float fun(int n) 后是没有分号的。
少加或者多加分号系统在编译时都会报错。还有一种情况再系统编译时并不报错,但是程序的执行顺序被改变了。如:
if(a%3==0);
i++;
本意是如果加 3 整除 a,则 i 加 1,但是由于 if(a%3==0)后多加了分号,即 if 语句后为空语句,程序将无条件 i++ 语句, 不论 3 是否整除 a,i都将自动加 1。
6、输入变量时忘记加地址运算符 “&” 或在不应加 “&” 的位置加了地址运算符
(1)忘记加 “&” 的情况,如:
int a, b;
scanf("%d %d", a, b);
此时,无法正确给 a 和 b读入数据。scanf 函数的作用是:按照 a、b在内存中所分配的地址将 a、b 的值存进去。 “&a” 指 a 在内存中的地址,因此正确的书写格式为:
scanf("%d %d", &a, &b);
(2)多加 “&” 的情况。如:
int str[];
scanf("%s", &str);
C 语言编译系统对数组名的处理是:数组名代表该数组的起始地址,scanf 函数中的输入项是字符数组名,因此不必再加地址运算符 “&” 。
7、输入数据的方式与要求格式不符
例如:
scanf("%d,%d", &a, &b);
C语言规定:如果在“格式控制”字符串中,除了格式说明以外还有其他字符,则在输入数据时应输入相同的字符。下面输入是合法的。
3,4
此时不用逗号而用空格或其它字符是不对的,如:
3 4(中间为空格)
3:4(中间为冒号)
8、输入字符的格式与要求不一致
在用 “%c” 格式输入字符时,“空格字符” 和 “转义字符” 都将作为有效字符输入。例如:
scanf("%c%c%c", &c1, &c2, &c3);
如输入:
a b c
字符 ‘a’ 送给 ‘c1’,字符 ‘ ’(空格)送给 ‘c2’,字符 ‘b’ 送给 ‘c3’,因为 %c 只要求读入一个字符,后面不需要用空格座位两个字符的间隔。
9、输入输出的数据类型与所用格式说明符不一致
例如:a 定义为整型,b 定义为实型。
int a=3;
float b=4.5;
printf("%f%d\n", a, b);
编译时不给出错误信息提示,但运行结果将与愿意不符,这种错误尤其需要注意。
10、输入数据时,企图规定精度
scanf("%7.2f", &a);
上述语句是不合法的,输入数据时不能规定精度。
11、switch语句中漏写 break语句
例如:根据考试成绩的等级打出百分之分数段。
switch(garde){
case 'A':printf("85~100\n");
case 'B':printf("70~84\n");
case 'C':printf("60~69\n");
case 'D':printf("<60\n");
default: printf("error\n");
}
由于漏写了 break 语句,case 只起标号的作用,而不起判断的作用。因此,当 grade 值为 A 时,printf 函数在执行完第一个 printf 语句后接着执行后面的 printf 函数语句。正确写法应在每个分支后加上 break,应该为:
switch(garde){
case 'A':printf("85~100\n");break;
case 'B':printf("70~84\n");break;
case 'C':printf("60~69\n");break;
case 'D':printf("<60\n");break;
default: printf("error\n");
}
12、在定义数据时,将定义的 “元素个数” 误认为是可使用的最大下标
例如:
mian(){
sattic int a[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("%d", a[10]);
}
C 语言规定:定义时用 a[10] 表示数组 a 中有 10 个元素,其下标由 0 开始,所以数组元素 a[10] 是不存在的,这种错误成为 “越界”。
13、自增(++),自减(–)运算符的使用
自增(减)运算符只能与变量相结合,其运算规则为:自增(减)后后缀形式是先引用后增(减)值;自增(减)前缀形式是先增(减)值后引用。
14、if 与 else 的匹配问题
在不能准确确定 esle 与前面哪个 if 相匹配时,应遵循一原则:见到 else 后,要与它前面的离它最近的没有配对的那个 if 相匹配。
15、“\” 和 “/” 的混淆
前者是除号,在进行相除运算时常会把 “/” 写成 “” ,应特别注意。
16、C语言关键字的拼写
如:main——mian(错误),print——pirntf(错误),return——retrun(错误),while——While(错误)
17、在做改错题时要注意数字与拼音的区别
字形相似的有:0(零)与 o,1(数字 1)与l(小写字母L)等。