C语言中常见错误分析
作者:单树倩 任佳勋
来源:《电脑知识与技术》2009年第26
        摘要:C语言是许多高校开设的第一门程序设计语言,使用方便灵活。根据C语言的特点,并结合实际教学,对在编程中经常遇到的错误进行分析、总结,为初学者尽快掌握C语言,提高程序设计水平提供借鉴。
        关键词:C语言;常见错误;逻辑错误;指针;变量
        中图分类号:TP312文献标识码:A文章编号:1009-3044(2009)26-7447-03
       
        Common Errors in C Language
        SHAN Shu-qian1, REN Jia-xun2
        (1.North China Electric Power University Science & Technology College, Baoding 07105
1, China; 2.BaoDing LiZhong Wheel Manufacturing CO.,LTD, Baoding 071051, China)
        Abstract: C language is the first of many colleges and universities opened the door programming language, easy to use and flexible. According to C language features, combined with the practical teaching, often encountered in the programming errors in the analysis, summarization, as soon as possible for beginners to master c language, raise the level of program design to provide reference.
        Key words: C language; common errors; logical errors; pointer; variable
       
        C语言是国内外广泛使用的一种计算机语言。由于其功能丰富、表达能力强、使用方便灵活、应用面广、目标程序效率高、可移植性好等特点,深受广大计算机工作者和应用人员的喜爱。许多高校都将其作为大一学生学习程序设计的入门语言。但C语言牵涉的概念比较复杂,规则多,虽然使用灵活,但是很容易出错。结合实际教学中经验,对学生学习C语言时常见错误进行归纳总结,供初学者借鉴。
       
        1 C语言使用中常见的错误
       
        1.1 大小写错误
        C语言规定所有的标识符是区分大小写的;所有的关键字必须为小写。如:sumSUM就是不同的标识符。
        1.2 用户自定义标识符的中错误
        C语言中规定,用户自定义的标识符可以用来区分变量、符号常量、函数名、数组、类型等数据对象c语言错误提示大全,只能由数字、字母、下划线组成且第一个字符必须是字母或者下划线。用户自定义的标识符不能与关键字相同。许多学生在使用过程中经常忘记这一规定。如定义一个整型变量:int char;错误之处在于将关键字char 定义为用户标识符,这是不允许的。
        1.3 使用未定义的变量或者变量使用前未赋值
        main( ){ int a,b=3;printf(“a=%d,b=%d,c=%d\n”,a,b,c);}
        此例中,会得到如下的错误提示:error C2065: 'c' : undeclared identifier执行 cl.exe 时出错。出错原因在于变量c在使用前未定义。
        定义变量c之后的程序如下:
        main( ){ int a,b=3,c=4;printf(“a=%d,b=%d,c=%d\n”,a,b,c);}
        程序运行时并没出现语法错误,运行结果为:a=-858993460,b=3,c=4
        从本例可以看出,在定义变量a,b,c的同时,仅完成了对变量bc的初始化,变量a在使用之前未被赋值,因而得到a=-858993460的结果。此结果的得出是由分配给变量a的内存空间里的数据经转化得到。这个数值是随机值,由分配给a的内存空间里的数值决定。此类错误为逻辑错误,不易察觉。程序可以修改为:
        main( ){ int a=2,b=3,c=4;printf(“a=%d,b=%d,c=%d\n”,a,b,c);}
        运行结果为:a=2,b=3,c=4
        1.4 混淆“=”“==”
        C语言中,“=”是赋值运算符,表示将“=”右边的值赋给左端的变量,不能做等号使用。“==”才是表示两个数据是否相等的关系运算符。“==”的优先级比“=”高。
        例如:
        main(){ int a=0,b=1;if (a=b)printf(“a=%d”,a); }
        输出结果:a=1
        分析:执行if语句时,无论a原来为何值,都被b的值所取代,a值变为1。所以表达式“a=b”的结果永远为非零,if 语句执行,输出结果a=1
        要表示ab比较的关系,则程序改为:
        main(){ int a=0,b=1;if (a==b)printf(“a=%d”,a);}
        只有当ab的值相等时,if语句才执行,输出a的值;否则,if语句结束。
        1.5 使用逻辑运算符常出现的错误
        逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。有以下的程序段:
        int a=1,b=2,c=3,d=4,m=1,n=1; 执行完语句“ (m=a>b)&&(n=c>d);”,mn的值分别为 0 1a>b的结果为0,因而m的值变为0。运算符“&&”的第一个运算对象为0(即为假),所以不管右端的表达式(n=c>d)的值为何,逻辑与的结果都为0。因而(n=c>d)是不必运算的,所以n保持原值1,而不是0
        同理:int a=1,b=2,c=3,d=4,m=1,n=1; 执行完语句“ (m=ad);”,mn的值分别为1 1,n保持原值不变。
        1.6 对复合语句忘记加花括号“{ }”
        有以下程序段:
        int i=1,sum =0;
        while(i
        sum=sum+i;
        i++;
        程序本意是要执行1+2+...+10,while语句却是一个死循环。原因是循环语句中的循环体应是由花括号“{}”括起来的一个复合语句。由于在while语句中循环体少了花括号,则循环体仅由一个语句构成,sum=sum+i;而语句i+ +;则是循环语句的下一条语句,不再是循环体中的语句。由于起循环控制作用的变量i的值始终未被改变,因此构成死循环。根据题意,应将该程序段中的while语句修改为以下形式:
        int i=1,sum =0;
        while(i
        { sum=sum+i;
        i++;
        }
        1.7 scanf()函数输入变量值时的错误
        1.7.1 漏写取地址运算符“&”
        :int a; scanf(“%d”,a); /* a前漏写& */
        C语言中,scanf()函数的输入项必须用地址表示,作用是按照a在内存的地址将输入的数值存入。
       
        1.7.2 输入普通字符也应输入
        例如有程序段:int a; scanf(“a=%d”,&a);从键盘输入数值,使a10。则正确的输入形式应该为:a=10《回车》
        如果忘记输入普通字符“a=”,变量a将不会得到正确数值10
        1.8 忽略某些函数的求值顺序
        :main ( )
        {intx=100;
        printf (“ %d,%d,%d,%d”, x++,x,--x,x);
        }
        运行结果为:99,99,99,100
        这是由于在Turbo c中执行printf()函数时,参数是按照从右到左的顺序被压入栈中的,即先压入x,在压入—x,然后x,最后是x++。弹出时依次为:x++,x,--x,x。因而得到上述结果。
        1.9 switch语句中缺少break语句
        :int day;scanf(“%d”,&day);
        switch (day)
        {case 1 : printf(“Monday”);
        case 2 : printf(“Tuesday”);
        case 3 : printf(“Wednesday”);
        default: printf(“input error!\n”);
        }
        程序本意是根据变量day的取值(1,23),分别打印出Monday,Tuesday,Wednesday否则打印input error
        如果输入day的值为1,打印结果是MondayTuesdayWednesdayinput error而不是我们想象中的Monday。导致此结果原因在于:在执行第一个printf()函数调用语句之后,程序继续执行接下来的三个printf()函数调用语句。这种情况的产生是由于在switch语句中缺少break语句所造成。将上述程序段改为以下形式:
        int day;scanf(“%d”,&day);
        switch (day)
        {case 1 : printf(“Monday”);break;
        case 2 : printf(“Tuesday”); break;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。