C语言常见易错点小结
C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。看着有错的程序,不知该如何改起,本人通过对C的学习,积累了一些C编程时常犯的错误,写给各位学员以供参考。 ### C语言常见易错点小结 C语言作为一种强大的编程语言,在软件开发领域有着广泛的应用。然而,由于其编译器对于语法的检查不如其他一些高级语言那样严格,因此在编写过程中很容易出现一些不易察觉的错误。对于初学者而言,这些错误可能会导致代码无法正常运行或者结果与预期不符。下面,我们将根据给定的信息总结一些常见的C语言易错点,帮助学习者更好地理解和避免这些问题。 #### 易错点一:大小写的混淆 在C语言中,变量名是区分大小写的。例如: ```c main() { int a = 5; printf("%d", A); } ``` 这里`a`和`A`被视为两个不同的变量。如果想要输出变量`a`的值,则应该使用`printf("%d", a);`。在C语言中,大写和小写字母代表不同的标识符,因此务必保持一致性。 #### 易错点二:模运算符的误用 模运算符`%`用于计算两个整数相除后的余数。例如: ```c main() { float a, b; printf("%d", a % b); } ``` 这段代码会引发编译错误,因为`%`只能用于整数之间。如果想要进行浮点数的模运算,需要使用其他方法或库函数。 #### 易错点三:字符赋值错误 字符在C语言中通常使用`char`类型来表示。例如: ```c char c; c = "a"; ``` 这里的错误在于试图将一个字符串("a")赋值给一个字符变量。正确的做法是: ```c char c = 'a'; ``` 需要注意的是,字符需要用单引号表示,而字符串则需要用双引号。 #### 易错点四:赋值运算符与比较运算符的混淆 赋值运算符`=`用于为变量赋值,而比较运算符`==`用于判断两个值是否相等。例如: ```c if (a = 3) then ``` 这里的`=`应该改为`==`,即`if (a == 3)`,这样才能正确判断`a`是否等于3。 #### 易错点五:分号的不当使用 在C语言中,每个语句后面都需要加上分号`;`作为结束。例如: ```c a = 1 b = 2 ``` 以上代码缺少分号,正确的写法应该是: ```c a = 1; b = 2; ``` 另外,在某些复合语句中,如`if`语句中,分号的使用也需特别注意。例如: ```c if (a % 3 == 0); i++; ``` 这里的分号使得`i++`语句变成了一个独立的语句,而不是`if`语句的一部分。 #### 易错点六:括号的使用 括号在C语言中非常重要,尤其是在控制结构中。例如: ```c {z = x + y; t = z / 100; printf("%f", t); } ``` 在C语言中,复合语句需要使用括号来包裹,否则会导致逻辑错误。 #### 易错点七:输入输出中的错误 在处理用户输入时,需要注意如何正确使用`scanf`函数。例如: ```c int a, b; scanf("%d%d", &a, &b); ``` 这里正确使用了`&`符号来获取变量的地址。但是,在输入格式中使用逗号或空格作为分隔符时,需要注意与实际输入的一致性: ```c scanf("%d,%d", &a, &b); ``` 如果输入格式不匹配,将会导致读取失败。 #### 易错点八:格式化字符串的使用 在使用`printf`函数时,需要确保格式化字符串与输出变量的数据类型相匹配。例如: ```c a = 3; b = 4.5; printf("%f%d\n", a, b); ``` 这里`%f`应该用于浮点数,而`%d`用于整数。因此,正确的写法应该是: ```c printf("%d%f\n", a, b); ``` #### 易错点九:`switch`语句中的`break`遗漏 在使用`switch`语句时,每个`case`分支后都应该加上`break`语句,以防止执行下一个分支。例如: ```c switch (grade) { 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`,当`grade`为'A'时,将会依次执行所有的`printf`语句。 #### 易错点十:`while`循环与`do-while`循环的区别 `while`和`do-while`循环都是用来实现循环操作的,但它们在执行顺序上有区别。例如: ```c int a = 0, i; scanf("%d", &i); while (i <= 10) { a = a + i; i++; } printf("%d", a); ``` 与 ```c int a = 0, i; scanf("%d", &i); do { a = a + i; i++; } while (i <= 10); printf("%d", a); ``` 当条件不满足时,`while`循环可能一次都不会执行,而`do-while`循环至少会执行一次。 #### 易错点十一:动态数组的使用 在C语言中,动态数组的创建需要使用指针和内存分配函数。例如: ```c int n; scanf("%d", &n); int *a = malloc(n * sizeof(int)); ``` 这里使用`malloc`函数动态分配内存。 #### 易错点十二:数组越界访问 访问数组时超出其界限是非常常见的错误。例如: ```c static int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; printf("%d", a[10]); ``` 这里试图访问数组`a`的第11个元素,但实际上数组的索引是从0开始的,最大索引为9。 #### 易错点十三:初始化时的静态变量 在初始化数组时,需要明确使用静态存储类。例如: ```c int a[3] = {0, 1, 2}; ``` 正确的做法应该是使用`static`关键字: ```c static int a[3] = {0, 1, 2}; ``` #### 易错点十四:字符串输入的错误 在使用`scanf`函数读取字符串时,需要注意不要直接使用`&`符号。例如: ```c scanf("%s", &str); ``` 正确的做法是: ```c scanf("%s", str); ``` #### 易错点十五:函数定义的语法错误 在定义函数时,参数列表中的变量声明需要正确。例如: ```c int max(x, y) int x, y, z; { z = x > y ? x : y; return z; } ``` 这段代码中,函数参数列表的语法是错误的。正确的写法应该是: ```c int max(int x, int y) { int z = x > y ? x : y; return z; } ``` 以上列举的这些易错点是初学者在学习C语言过程中经常遇到的问题。通过理解和掌握这些知识点,可以有效地提高编程效率,减少不必要的错误。
1.书写标识符时,忽略了大小写字母的区别。
main()
{
int a=5;
printf("%d",A);
}
编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。
2.忽略了变量的类型,进行了不合法的运算。
main()
{
float a,b;
printf("%d",a%b);
}
%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。
3.将字符常量与字符串常量混淆。
char c;
c="a";
在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\',而把它赋给一个字符变量是不行的。
4.忽略了“=”与“==”的区别。
在许多高级语言中,用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写
if (a=3) then …
但C语言中,“=”是赋值运算符,“==”是关系运算符。如:
if (a==3) a=b;
前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。
5.忘记加分号。
分号是C语句中不可缺少的一部分,语句末尾必须有分号。
a=1
b=2
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。
t=z/100;
printf("%f",t);
}
对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。
6.多加分号。
对于一个复合语句,如:
{ z=x+y;
t=z/100;
printf("%f",t);
};
复合语句的花括号后不应再加分号,否则将会画蛇添足。
又如:
if (a%3==0);
I++;
本是如果3整除a,则I加1。但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1。
再如:
for (I=0;I<5;I++);
{scanf("%d",&x);
printf("%d",x);}
本意是先后输入5个数,每输入一个数后再将它输出。由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。
7.输入变量时忘记加地址运算符“&”。
int a,b;
scanf("%d%d",a,b);
这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。
8.输入数据的方式与要求不符。①scanf("%d%d",&a,&b);
输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
3,4
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。
②scanf("%d,%d",&a,&b);
剩余5页未读,继续阅读
- leluoqun22015-03-04非常感谢,总结的还可以
- 享受编程乐趣2013-03-30总结的非常全面,还有例子,很好。
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip