正文

计算机待级考试(二级) 2006-07-31 01:41:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/petibo/17033.html

分享到:

 c语言二级考试主要考c语言程序设计知识,除此之外还有计算机基础知识、dos基本操作、windows基本操作的内容,有些考生只注重c语言知识的学习,忽略了c语言之外内容的复习,造成不小的损失。c语言二级考试笔试试题有选择和填空两类大题。以下仅对c语言中的一些易错难懂的题进行解析。  1、设有如下的变量定义:  int i =8,k ,a,b ;  unsigned long w=5;  double x=1,42,y=5.2;  则以下符合c语言语法的表达式是  a、a+=a-=(b=4)*(a=3)  b、x%(-3);  c、a=a*3=2     d、y=float(i)  答案:a  解析:赋值运算符按照“自右而左”的结合顺序,答案a的运算顺序是:先将4赋给变量b,3赋给变量a,然后计算a=a-b*a,运算后变量a的值为-8,最后计算a=a+a,此表达式最终结果为-16,c语言的表达式很简洁,但是心中必须清楚运算的顺序。模运算要求两个数必须是整型数据,故答案b是错误的。答案c是错误的原因是不能将一个常数赋给一个表达式。答案d也是错误的,应该给float加上括号才对,需要强调的是强制类型转变后变量i本身的数据类型没有改变,强制类型运算后得到一个float型的中间变量。  2、以下程序的输出结果是  a、2 0 b、3 1   c、3 2 1 d、2 1 0  main( )   { int n=4;   while(n╠╠)printf("%d ",--n);  }  答案:a  解析:这道题是考查考生对自增运算符以及循环语句的的掌握。n的含义是先使用变量n,使用完后再使其减1,n表示先使变量n减1后再使用n。自增运算符是c语言的重点和难点,每次考试都考。该题的运行步骤是首先判断条件表达式的真假,因为变量n的值为4大于0,所以条件表达式的值为真,判断完条件表达式之后,变量n的值变为3,然后执行循环体,要输出n的值,显然是先对n减1再输出,故输出应是2,然后再进行第二次循环,由于变量n的值大于0,故条件表达式的值为真,判断完条件表达式之后,变量n的值变为1,然后执行循环体,输出n的值为0,然后判断条件表达式n的值为假,跳出循环。  3、若有说明:long *p,a;则不能通过scanf语句正确给输入项读入数据的程序段是  a、*p=&a; scanf("%ld",p);  b、p=(long *)malloc(8); scanf("%ld",p);  c、scanf("%ld",p=&a);  d、scanf("%ld",&a);  答案:a  解析:p是一个指针变量,只能存放long型变量的地址,*p表示指针p所指向的long型变量,因此只能将long型数据赋给*p(其实就是指针p所指向的变量),所以答案a是错误的,它将变量的地址赋给了*p,造成数据类型不符的错误。答案b的第一句是在内存中开辟8个字节的存储区,然后将其地址经强制类型转换后赋给指针p,答案b的用法是正确的。答案c中是将变量a的地址先赋给指针变量p,然后再从键盘上接受数据,这里需要注意的是因为指针变量p本身就表示地址,所以在scanf函数的地址表列中不能写成&p。答案d也是正确的。  4、以下叙述中正确的是  a、输入项可以是一个实型常量,如:   scanf("%f",3.5);  b、只有格式控制,没有输入项,也能正确输入数据到内存,例如:  scanf("a=%d ,b=%d");  c、当输入一个实型数据时,格式控制部分可以规定小数点后的位数,例如:  scanf("%4.2f",&d);  d、当输入数据时,必须指明变量地址,例如:   scanf("%f",&f);  答案:d  解析:scanf中的格式控制部分不能规定小数点后的位数,这和printf有区别,scanf中的输入项不能是一个实型常量, 而且用scanf函数从键盘上接受数据时,要求与格式控制符内的格式保持一致,如scanf("a=%d ,b=%d",&a,&b);你在输入数据时必须为a=3,b=4(回车),还要注意输入字符型数据时不能用回车作为间隔,因为回车也是一种特殊的字符。  5、以下程序的输出结果是  a、x=4 b、x=8   c、x=6 d、x=12  main()  { int i, jx=0; for (i=0; i<2; i++)  { x++; for(j=0; j<3; j++)   { if (j%2) continue; x++;  } x++;  } printf("=%d\n",x);  }  答案:b  解析:for循环嵌套时,阅读起来容易让人混淆,关键是确定循环体的范围,当循环体多于一句时,循环体是用花括号括起来的,只有执行完循环体的全部语句后,才能进行下一次循环,除非碰到break或continue语句,而且内循环跳出后才能回到外循环继续执行。continue语句只能用于循环语句,碰到continue语句就表示不执行后面的语句,直接转到下一次循环的开始,俗称“半途而废,从头再来”,而break语句表示跳出当前的循环体进行“逃亡”, break语句不能跳出多层循环,只能跳出当前循环。break语句只能用在循环结构和switch结构中。弄清上述问题,这个程序你也就能看懂了,程序中的printf语句处在最外一层循环的后面,因此只能输出一个值,程序中有三个x++,它们的执行顺序和次数是不一样的。  6、若已定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1] 地址的表达式是  a、p+1 b、a+1   c、a++ d、++p  答案:c  解析:此题中p和a都表示a[0]的地址,p+1 和a+1都未改变p的值,它们表示的都是a[1]的地址,a++ 这种用法是错误的,数组名表示的是数组的地址是常量,不能对其自增或自减,++p 改变了p的值,表示的也是a[1]的地址 。

阅读(2657) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册