二级C常见易错题.doc

上传人:博****1 文档编号:560120008 上传时间:2022-09-28 格式:DOC 页数:5 大小:40KB
返回 下载 相关 举报
二级C常见易错题.doc_第1页
第1页 / 共5页
二级C常见易错题.doc_第2页
第2页 / 共5页
二级C常见易错题.doc_第3页
第3页 / 共5页
二级C常见易错题.doc_第4页
第4页 / 共5页
二级C常见易错题.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《二级C常见易错题.doc》由会员分享,可在线阅读,更多相关《二级C常见易错题.doc(5页珍藏版)》请在金锄头文库上搜索。

1、计算机等级考试二级C常见易错题1. 宏定义define在C语言中,宏定义只是进行替换,而不进行运算。这种题型在二级考试中经常出现,并且如果对宏定义没有理解,答案很容易错,并且错误还比较隐蔽。例如:请写出下面代码的运行结果:define F(x,y) x*yvoid main()int z;z=F(2+3,3+4);printf(“%d”,z);有些人一看,这还不简单,答案不就是5*7=35嘛。错了,刚才说了,宏定义不会进行运算,只是替代,所以答案应该是2+3*3+4=15。所以平时在使用宏定义时一定要注意。有时候遇到这样的题目可能会留心出题者设计陷阱,但平时可能我们自己不经意的也会给自己下了这

2、样一个圈套。像上面的题还比较容易,有时候嵌套使用还会让一些人防不胜防,比如上面题改为z=F(2+F(2,3),3+4),注意不能先算F(2,3)2. 传值调用与传址调用有些人对这种题型很困惑,往往看起来差不多的题,答案就是不一样,自己又分析不清楚。我们先看下面的题目,写出运行结果。void fun(int x,int y)int t;t=x;x=y;y=t;void main()int a=2,b=3;fun(a,b);printf(“%d,%d”,a,b);void fun(int *x,int *y)int t;t=*x;*x=*y;*y=t;void main()int a=2,b=3;

3、fun(&a,&b);printf(“%d,%d”,a,b);这是二级考试中一定会出现的题目,甚至可能一套题出现两次,考察的内容就是能不能把传值调用和传址调用分清楚,在选择题或填空题中都可能出现。特别在做选择题时,有人知道以上两段代码肯定有一个实现了a,b的交换,有一个没有实现,但就是不知道到底哪一个实现了。上面两段代码的结果分别是2,3和3,2,也就是说第二段代码实现了a和b的交换。我们一起分析一下。第一段代码调用fun函数,把a,b的值传递给了x,y,所以下面进行交换的就是x和y,而不是a和b,所以最后输出a,b的值仍然为2,3第二段代码把a,b的地址传递给了x,y,那么x,y就分别指向了

4、a,b,这时x,y指向的内容为2,3。当调用函数fun时,交换的是x,y所指向的内容,即变成了3,2.,也就是把a,b指代的内容都替换了,所以最后a,b的结果就变成了3,2。相当于第一段代码a,b,x,y是相互之间没有任何联系,而第二段代码x,y就是a,b的地址,所以第二段代码能够实现a,b的交换。在C+中,传引用与上述传址情况是一样的。这种题还有以下几种变换:主函数a,b也写成x,y,注意不要被蒙蔽,答案还是跟刚才一样;还有就是第二段代码中t前面加上地址符号,这时又不会实现交换,所以不是说有地址就一定交换,你们可以自己分析一下。有时候出题者会把结构体也放进来,对于那些不熟悉结构体的人来说,这

5、样的题就更头疼了,所以上面的分析一定要弄懂。3. 逻辑运算在这里设置陷阱,题目中不一定要出现&,|,!这样的逻辑运算符,因为在if,while,for等语句中要判断条件是否成立,所以出题者会在这里做手脚,例如下面就是一道迷惑性很强的题目。if(543) printf(“11”);else printf(“22”);程序运行的结果为: 很简单的一段代码,有些人一看,很明显543成立,所以结果是11.嘿嘿,又中计了吧,答案是22,543是错的,为什呢?对于连大于号计算机中可不像我们平时那样去比。在计算机中逻辑运算结果要么为0,要么为1,所以54为真,其结果为1,然后13,那当然就错了,所以这题的答

6、案是22。所以如果我们要表示我们平时所说的543,就应该这样写:54&43还有些人看不懂if或while括号里面写一个变量是什么意思,例如:a=1;if(a)其实只要a不为0,意思就是条件为真类似的b=-1;while(b)就是循环条件永远成立(如果b在循环体内没有被改变),要退出循环,循环体里面可以加break等退出。4. 分号或的位置在C语言中,分号代表一句话的结束,也是一部分程序段的结束标志,所以它们的位置会影响程序的运算结果。例如int sum=0;for(i=0;ia) t=a;a=b;b=t;if(bc) t=b;b=c;c=t;printf(“%d,%d,%d,%d”,a,b,c

7、,t);程序的运行结果是多少呢?第一个条件ba成立,a,b交换,a变成2,b变成1,t也变为1第二个条件不成立,没有执行if里面的语句,所以最后结果为2,1,3,1错了!为什么,错误的原因是if语句管的范围,最容易误导我们的是if后面的几条语句使我们很常用的交换两个值的语句,使我们容易上当。这题每个if只管到它之后的第一条语句。所以在第二个if之后的b=c;c=t仍要执行,所以正确答案应该是2,3,1,15. 注释关于注释的题在二级中出现的次数较少,但是如果在程序分析题中出现,很容易误导考生,因为注释中的内容不进行编译,不会运行注释里面的内容。int a=10,b=20,c;c=a+b;pri

8、ntf(“%d”,c);/*注意:在下面的程序中改为a=-10,b=-20; */c=a+b;printf(“%d”,c);其实只要清楚注释的功能,这题的答案很显然就是3030,因为注释中的语句对程序不会有任何影响,我们完全可以去掉程序中的语句。有些人一看到注释就会跳过去,这里出题者故意用“注意”这样的字眼让做题者看注释里面的内容,其实只要记着注释里面的内容与运行结果没有关系就可以了。6.静态变量static做题时遇到静态变量就要明白静态变量的生存期,从定义开始到整个程序的结束,也就是静态变量只有程序结束才销毁,这是与动态变量的本质的区别。例如:void fun()int sum=200;st

9、atic int i=0;i+;sum+;printf(“%d,%dn”,i,sum);void main()int j;for(j=0;j5;j+)fun();结果为:1,2012,2013,2014,2015,201从上面的结果可以看出静态变量与动态变量的区别。上面程序段中i是静态变量,所以在每次循环之后该变量一直存储在内存中,它的值一直增加。而sum是动态变量,它每次随着fun函数的结束而销毁,所以for循环中每次执行fun时,sum的初值都为200,自增之后变为201。7等号与赋值符号在C语言中,等于是双等号=,而我们平时用的=在C语言中是赋值符号,所以我们有时候很容易将赋值符号误认为

10、是等于运算,从而导致错误。在二级考试的时候,出题者往往从这里做文章,如果一没注意就会使我们上当。其实我们平时也很容易犯这样的错误。int a=0;if(a=1) printf(“yes”);else printf(“no”);如果不太细心,运行结果很容易写成no,答案应该为yes。if条件a=1,意思不是我们平时说的a等于1,而是把1赋给a,只要把不为0的值赋给a,if条件都是成立的,因此运行结果为yes。如果把条件改为a=1,那么运行结果就是no。8. i+和+ii+和+i对于初学者来说可能不太好理解,知道i+是先运算后自增,+i是先自增后运算,但是知道光知道,并不明白是什么意思。如果学了C

11、语言一段时间用的多了,可能会觉得比较容易了。例如int i=10,j=10;printf(“%d,%d,%d,%d”,i,i+,j,+j);运行结果为10,10,10,11。我们主要看一下i+与+j的运行结果,我们写成x=i+,y=+j。i,j的初值都是10,i+是i先运算后自增,先赋给x,所以x的值是10,即i+的值为10,运算之后i的值变为11。而+j是先自增后运算,j先增1变为11,再运算赋给y,即y的值为11,也就是+j的值是11,运算之后j的值也为11。当然熟练之后就不用添加变量x,y了,刚才只是为了便于理解。9. 数据类型转换C语言中进行运算时,同一表达式中各个变量数据类型要相同,

12、如果不同系统就会自动转换,如整型和浮点型运算时系统会自动转换成浮点型。如果系统不会自动转换,可以用强制类型进行转换。像系统能够相互转换的数据类型在进行编译的时候会给出警告,但是考试时就不会有人给你提示了,自己就得小心一点。例如:int a=97;printf(“%c”,a);当然考试不会出这么简单的题,我只是举个例子说明一下。如果不注意,结果可能就写成了97,注意%c,是输出一个字符,所以结果是ASCII为97对应的字符,结果就是a。还有更容易出错的情况:int a=6,b=4,c=8,d;d=a/b*c;printf(“%d”,d);这个题嘛,简单!6/4*8=1.5*8=12。错了,答案是8,6/4的结果不是1.5,而是1,所以结果是8。在C语言中,整型数据除以整型数据结果还是整型数据,不可能是浮点型数据,只要注意到就不会出错了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号