在初学者学习编程的过程中的会遇到一些经常会犯的错误,也许在我们成长起来之后会觉得这些错误实在太低级,但是在牛掰的大虾也是从菜鸟过来的,针对于初学者下边总结了一些我们会经常遇到的陷阱,希望对菜鸟们有帮助: 正题: 陷阱1:忽略大小写的区别#include<stdio.h>( ⊙ o ⊙ )啊! void main() { inta=10; a+=a; printf("%d\n",A); } 这个很简单,是基础,c语言变量区分大小写。代码中的a与A不是同个变量,编译出现A没定义的错误。 陷阱2:“{}”与“()”使用不当造成错误#include <stdio.h> void main() { int i,j; inta[2][3]={(1,2,3),(4,5,6)}; printf("arraya:\n"); for(i=0;i<=1;i++) { for(j=0;j<=2;j++) { printf("%d",a[j]); } printf("\n"); } } } 程序结果不能正常输出数组每个元素,编译{(1,2,3),(4,5,6)};时,先进行括号内的逗号运算(取逗号最后的数值),编译生成{3,6};其它元素为0。正确的写法:{{1,2,3},{4,5,6}}; 陷阱3:在if,while,#include,#define,for后直接加分号,如for(int a=1;a<10;a++);如果是while,程序一般执行死循环,int a=1;while(a); 如果是if,判断语句无效果,比如。if(a>0);a=-1;无论a是否大于0,结果都是a=-1; 如果是#include,程序编译的时候提示错误,无法引用库文件; 如果是#define,比如#define a 200;程序在预编译的时候,200;包括分号一同被替换进程序,程序不可能正常编译 如果是for循环,跟if一样,事与愿违,循环做无用功,本想循环的printf语句只执行一次。for(int a=1;a<10;a++);printf("%d",a);程序只输出一次a值。 陷阱4:使用循环语句不慎产生死循环#include<stdio.h> void main() { unsigned int i; for(i=10;i>=0;i--) printf("%d",i); printf("\n"); } i被定义为无符号整型变量,i的值永远大于等于0;i>=0永远成立; 陷阱5:do....while与while之间的区别do....while先执行再判断条件是否成立;无论条件是否成立,do....while至少执行一次; while 先判断,再执行;条件不成立,就不执行,可能执行0次; 陷阱6:数据溢出产生的错误#include<stdio.h> void main() { int i,rst; i=32767;//这里是turbo c中int类型为16位,c++为32位 rst=i+1; printf("%d,%d",i,rst); } c语言中int占两个字节,数据最大支持补码正数值32767,加1溢出。 陷阱7:除号/用法导致的错误如果除号的两边都为整数,结果为整数;两边有一个实数,结果为实数; #include<stdio.h> void main() { double i; i=9.5+1/2; printf("%f",i); } 结果输出9.500000;这里的1/2运算符两边为整数,1/2=0;正确的输出:i=9.5+1.0/2; 陷阱8:变量未定义虽说是人人都清楚的问题,但是还是会出现。 陷阱9:用scanf输入数据时忘记加&符号 #include<stdio.h> void main() { int a,b; printf("输入两个整数\n"); scanf("%d%d",a,b); printf("%d%d\n",a,b); } scanf第二个参数必须为地址。正确的写法:scanf("%d%d",&a,&b); 陷阱10:使用scanf函数输入格式不符#include<stdio.h> void main() { int a,b; scanf("%d,%d",&a,&b); printf("%d,%d",a,b); } 凡是学c语言都遇到过这问题,错在输入a和b时,忘了在ab之间输入逗号。 不是任何的场合适合用其他符号用作数据输入分割。比如scanf(“%s,%d,%s”,&a,&b,&c);a得到的是整个语句的内容。 我提议用空格取代其他符号分隔数据,可以减少不必要的错误。 陷阱11:输入的数据类型不符的陷阱比如在上代码程序输入字符'a','b'.输出不是想要的结果。改成scanf("%c%c",&a,&b),输入字符用%c。 陷阱12:switch语句中忘记使用break;#include <stdio.h> void main() { char grade; scanf("%c",&grade); switch(grade) { case 'a':printf("90-100\n"); case 'a':printf("80-100\n"); } switch中忘记用break;则每种情况都判断,满足条件都执行 } 陷阱13:指针没被初始化指针是存放地址的变量,与其他变量相同的是,变量未被赋值时,变量存放着内存上原本的值(内存的释放与文件的删除相类似,内存上的数据不改动,除非其他数据覆盖上去),变量的赋值就是数据的覆盖,内存上保存了上次运行的数据。未被赋值的指针,不知指向哪里。 #include<string> #include<stdlib.h> #include<stdio.h> using namespace std; int main() { char*str; strcpy(str,"good"); printf("%s",str); retrun 0; } 代码中的str指针未被赋值而使用,程序无法编译。 陷阱14:超出动态分配的内存#include<string> #include<stdlib.h> #include<stdio.h> using namespace std; int main() { char*str=malloc(5); strcpy(str,"goodluck"); printf("%s",str); free(str); retrun 0; } 程序动态分配5字节的内存空间,但是赋值超过了5字符,错误为赋值的数据超过动态分配的空间。 陷阱15:使用内存后未释放#include<string> #include<stdlib.h> #include<stdio.h> using namespace std; int main() { char*str=malloc(20); strcpy(str,"goodluck"); printf("%s",str); retrun 0; } 有必要在这里说说动态内存怎么释放: 内存未释放在程序运行时,开始不出现错误,过多占用内存时会造成内存空间不足而死机的现象。
|