c-语言程序设计-错题集_第1页
c-语言程序设计-错题集_第2页
c-语言程序设计-错题集_第3页
c-语言程序设计-错题集_第4页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.以下程序的运行结果是:#include<stdio.h>intmain()(voidfunfinti,intj);inti,x,j;i=2;x=5;j=7;fun(j,6);printf("i=%d;j=%d;x=%d\n"J/j/x);return0;)voidfun(inti,intj)(intx=7;printf("i=%d;j=%d;x=%d\n"JJ,x);}答案为:i=/;j=6;x=7i=2;j=7;x=5这题是调用函数类型,错误原因:当main中调用函数,即使没有返回值,但调用完了,还是要执行从调用函数之后的语句的。.分析下列程序,写出运行结果:#include<stdio.h>intabc(intx,inty);intmain()(inta=24,b=16,c;c=abc(a,b);printf("%d",c);printf("\n");return0;}intabc(intx,inty)(intt;while(){t=x%y;x=y;y=t;)returnt;}答案为:〇注释:while()括弧里面其实是变量y>0.分析下列程序,写出运行结果:#include<stdio.h>intw=3;voidmain()(intfun(intk);intw=10;printf("%d\n",fun(5)*w);}intfun(intk)(if(k==O)returnw;elsereturn(fun(k-l)*k);//else是可有可无的}答案为:3600〇注释:掉用函数的返回值是返回都函数调用的地方,像这道题最后递归调用的时候返回的值是到main中,最后是f(0)时返回w,此时的w是外部变量,因为在调用函数内部没有定义w,与此对比的是主函数中定义了W,所以主函数要用W就用主函数里面的值,而调用函数中只能用外部变量了,最终是120・主函数中的w=l0・调用函数中的返回w=3.结果为3600..分析下列程序,写出运行结果:#include<stdio.h>intd=l;f(intp)(staticintd=5;d+=p;printf("%d\n",d);return(d);}voidmain()(inta=3;printf("%d\n",f(a+f(d)));}答案为:6 15 15注释:精确理解静态局部变量的含义!!是在调用函数的时候,当第二次或下一次调用的时候,仍然沿用上ー次的变量结果。不管被调用函数是否在调用,静态局部变量所占的存储空间是不释放的。举例!!!静态局部变量不是在调用函数,与一般的变量的作用是ー样#include<stdio.h>Viodmain()(Statica=5;Intb=3;A=a+7Printf("%d\n",a);A=a+b;Printf("%d\n",a);)7分析下列程序,写出运行结果:#include<stdio.h>voidmain()(voidsort(inta[5]);inta[5]={5,10,-7,3,7},i;sort(a);for(i=0;i<=4;i++)printf("%5d\n",a[i]);}voidsort(inta[5])(intfor(i=0;i<4;i++)for(j=0;j<4-i;j++)if(aU]>aU+l]){t=-a[j];a[j]=a[j+l];a[j+l]=t;}}答案为:-10 3 -7-5 7注释:本题采用了冒泡法排序的方法,错误的地方在于:计算的多了,即是:当i=0时,j=0 12 3,当i=l,j=0 1 2,当i=2,j=01,当i=3,j=0要一步ー步来,详细的记录出每ー步的结果。每当Ij为一个值的时候,只计算一次,不能计算过多8分析下列程序,写出运行结果:#include<stdio.h>voidmain()(voidsort(inta[5]);inta[5]={9,6,8,3,;},i;sort(a);for(i=0;i<=4;i++)printf("%5d\n",a[i]);)voidsort(inta[5])(inti,j,pzt;for(j=0;j<4;j++)(P=j;for(i=j;i<=4;i++)if(a[i]<a[p])(P=i;t=a[p];a[p]=a[j];a[j]=t;)}}答案为:-1 36 8 9注释:本题采用了选择法排序,这里要区别选择法排序与冒泡法排序之间的异同点相同点在于,两者都是用来排序的,实现了降序和升序的简单操作。冒泡法排序可以理解成真正冒泡那样,两个相邻的数据之间进行比较,如果满足条件就进行相应的操作,而选择法排序的总思想是:找到最小或最大的数据(升序就是最小,,,降序就找最大的数据),让它占据第一个位置,然后在剩下的数据里再找出最小或最大的数据,让它占据第二个位置以此类推即可。9分析下列程序,写出运行结果:floatfun(floatx[],intnum)(inti;floatave,s=0;for(i=0;i<num;i++)s+=x[i];

ave=s/num;return(ave);}#include<stdio.h>voidmain()(floata[20],t;inti,n;for(i=0;i<20;i++)(scanf("%f",&t);a[i]=t;}printf("average=%f\n",fun(a,20));}注释:本题的作用是:运用fun函数来计算20个学生的平均成绩的。这里要注意了,调用函数时直接是函数名(实参)就行了。不需要其他的任何东西。尤其是与调用函数的首部那样,每ー样都写,那样会很麻烦的?10已知有声明"intx=5,y;floatz=2”,以下表达式中语法正确的是:CA:y=x%zB:x>0?y=x:y=-x;A:y=x%zB:x>0?y=x:y=-x;C: y=x/2=z D:y=x=z/2;10. 已知有声明"charch;inta;",执行语句scanf("%c%dn,&ch,&a);时如果从键盘输入的数据是“123”,则变量a得到的值是:23?11.分析下列程序,写出运行结果:#include<stdio.h>voidmain()(inta=0,b=l,c=2;if(a>0&&++b>0)C++;elsec-;printf("%d\n%d\n%d\n"za,b,c);}答案:0 1 1稻!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!12〇分析下列程序,写出运行结果:#include<stdio.h>intfun(intx)staticintc,y;

if(c==O)y=i;elsey=y+x;C++;returny;}voidmain()(inti;for(i=0;i<2;i++)printf("%d\n",fun(2));}答案为:1 3検!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!13分析下列程序,写出运行结果:#include<stdio.h>voidfun(int*a,intb)while(b>0)〃整个执行之后还要判断!!!while(b>0)〃整个执行之后还要判断!!!*a+=b;b--;}}voidmain()(intx=0,y=3;fun(&x,y);printf("%d\n%d\n",x,y);}答案为:63注释:在调用函数中,满足条件时就执行,但是执行之后还要继续判断条件是否满足,本题就是没有第二次判断条件是否符合,从而导致答案错误.函数gongyu的作用是求整数numl和num2的最大公约数,并返回该值。gongyu(intnuml,intnum2)(inttemp,a,b;if(numl《num2)temp=numl;numl=num2;num2=temp;)a=numl;b=num2;while( b!=0 )(temp=a%b;a=b;b=temp;)return(a);}.运行结果为:#include<stdio.h>f(intxjnty,intz){z=x*x+y*y}viodmian()inta=31;f(5,2,a)printf("%d",a);}答案为:31注释:因为没有返回值,建议要认真看题!!!.已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组的说明arry的错误定义方式为:f(intarry[3][])Inta[3][4];F(a);注释:不会!!!!. 假定int类型变量占用两个字节,其定义:intx[10]={0,2,4};,则数组x在内存中占用字节数为:20注释:数组的长度和类型确定后,其再内存中的大小就确定了。. 以下对ー维数组a进行正确初始化的语句是:DA:inta[10]=(0,0,0,0z0); B:inta[10]={};C:inta[10]={10*l}; D:inta[]={0};注释. 若有以下说明:#include<stdio.h>voidmian()inta[12]={l,2,3,4,5,6,7,8,9,10,ll,12};

charc='a',d,g;printf("%d\n",a[]);).则数值为4的表达式为:B:a['d'-c]D:a[4]A:a['d'-'B:a['d'-c]D:a[4]C:a[g-c]ン擬不 会!!!!!!!!!!!!.输出的结果是:26#include<stdio.h>intmain()(inta=0,i;for(i=l;i<5;i++)(switch(i){case0:case1:case2:a+=3;default:a+=5;printf("%d\n",a);return0;}注释:这里使用的是switch语句,那么这里的重点就是break语句的运用啦,我们可以看到case语句后面都没有break,这就要当i为1的时候,要执行easel后面的,case2后面的,直至到default后面的语句,当i为2的时候同样的执行方法,所以最后的结果是26..输出结果为:1010 9 1#include<stdio.h>intmain()printf("%d%d\n"/x-,y);return0;}注释:这里要理解for语句的执行过程,那就是先执行a的部分,实际上是赋值操作,然后判断a部分是否成立即是b部分,如果成立了,就执行下面的函数体部分,最后再执行c部分的语句,c部分最常见的就是使自身加1.但也不能排除其他的操作。注意这里的函数体其实是在输出语句过程中体现的,而且此时要注意,因为不常见,所以要特别注意啦!!如果把题目再改一下为#include<stdio.h>intmain()(intx=10,y=10,i;for(i=0;x>8;y=++i)printf("%d%d\n",x-,y);printf("%d%d\n",x-/y);return0;}其结果就是为1010 9 1 8 2.输出的结果是:41#include<stdio.h>intmain()(intk,i;for(i=0,k=l;i<5;i++){i+=k;k+=20;}printf("%d\n",k);return0;}注释:此处要说明的一下是:如果输出i的值就是24这道题的主要障碍是i不只是在自身加1的时候变化的,还有在函数体的时候也要变,当i等于〇时,执行函数体得i=l,k=21,接下来就是自身加1了,加了1,i就等于2,然后执行和之前的ー样的操作。得到i=23,k=41.再自身加!判断就不符合要求了,此时i=24.k=41.即是输出的结果!!!.分析下列程序,写出运行结果:#include<stdio.h>intd=l;voidfun(intp)(intd;d+=p++;printf("%d"zd);;}voidmian()(inta=3;fun(a);d+=a++;printf("%d",d);}不会???????????.分析下列程序,写出运行结果:Longfib(intn)(lf(n>2)Return(fib(n-l)+fib(n-2));Elsereturn(2);}Main()(Printf(“%d\n”,fib(3););}答案为:4错误原因:在调用函数内if条件的后面有两个fib,其返回值都是2.输出结果是:yzz#include<stdio.h>intmain(){inti,a=l,c=l;for(i=0;i<2;i++)switch(a++,a*c)case2:printf("y");case3:printf("z\n");break;default:printf("abc\n");)return0;}注释:至今还不会!!!w问题在于:switch()括号里有两个变量的东西怎么办??.运行结果是:4#include<stdio.h>intmain(){inti,j,a=0;for(i=0;i<2;i++)(for(j=0;j<4;j++)(if(j%2)break;a++;a++;printf("%d\n",a);return0;}注释:这里要说明的一点就是,if()语句,括号里面的j%2就相当于j%2==l0这一点要时刻记住!!.从键盘输入left?,则输出结果是:mfgu#include<stdio.h>intmain()(charc;while((c=getchar())!='?')putchar(++c);return0;}、流1不会!!!!!!!!!!!!!!.下面程序的输出结果是:1 20#include<stdio.h>intmain()inti,y,x;x=y=i=0;do++i;if(i%2!=0)(x=x+i;i++;}y=y+i++;}while(i<=7);printf("%d%d\n",x,y);return0;}注释:这ー题主要的注意点在:要细心,一步步来!!还有就是++i和i++两种不同的表达.从键盘输入1234,输出的结果为:4321.#include<stdio.h>intmain()intn;scanf("%d",&n);while(n!=O)(printf("%d",n%10);n=n/10;}return0;}注释:本题的错误在于:printf语句当中,n%10并没有再赋值给n.也就是说,当n=1234%10.等于4.然后n=n/10,就等于123,然后,再和上一次一样,进行同样的运算!!.程序运行后输出的结果是:程序进入死循环#include<stdio.h>intmain(){inti=0,x=0;for(;;)(if(i%7==0)continue;if(i>8)break;i++;x+=i;printf("%d\n",x);return0;}注释:这里会形成死循环的最主要原因是:在for语句的第三个表达式是空,而在下面也没有进行进ー步追加说明或操作!!本题的操作就在if语句和continue之间来回的交换。如果题目稍微的改一下,变成:#include<stdio.h>intmain(){inti=0zx=0;for(;;i++)(if(i%7==0)continue;if(i>8)break;i++;x+=i;}printf("%d\n",x);return0;}则结果就是21..程序运行后的输出结果是:2#include<stdio.h>intmain(){inta=3,b=4,c=5zd=2;if(a>b)if(b>c)printf("%d",d+++1);elseprintf("%d",++d+1);printf("%d\n",d);return0;}注释:就相当于:#include<stdio.h>intmain(){inta=3,b=4,c=5,d=2;if(b>c)printf("%d",d+++1);elseprintf("%d",++d+1);}elseprintf("%d\n",d);return0;}.以下程序运行的结果是:51#include<stdio.h>intmain(){inta,b;for(a=l,b=l;a<=50;a++)(if(b>=20)break;if(b%2==l)continue;b+=5;printf("%d\n",a);return0;}这里相当于进行相同的操作,即是b+=5;这条语句永远不执行。所以b=l,是永远正确的。直至a=51的时候,结束整个循环。然后输出a的值当然是51啦!!.输入abcdef,输出结果为:非字母数字字符#include<stdio.h>intmain()(charx;for(;x=(getchar()!=,\n');)putchar(x-32);return0;}流I不会!!!!!!!.从键盘输入goodafternooon!,输出的结果为:10,4#include<stdio.h>intmain(){inta=0,b=0;charch;while((ch=getchar())!='!')switch(ch){case'g':default:a++;break;case'o':b++;}printf("%d,%d\n",a,b);return0;}注释:强调一点就是:easel:case2: 等在地位上是平等的,ー上来就要找是否有符合要求的存在,要是存在就按其后面的语句执行。要是没有,就按从上向下的顺序,尤其要注意default在什么地方。还有一点要特别注意的是:要是找不到符合要求的就执行default之后的语句。这就是本题的关键所在!!!.输出的结果为:无限循环#include<stdio.h>intmain()inti,k;for(i=0,k=-l;k=l;i++,k++)printf("****\n");return0;}注举不 会!!!!!!!!!.设有定义:inta=l,*p=&a;floatb=2.0;charc='A';以下不合法的运算是:A:p++;B:a--;C:b++;D:c--;注释:编译的时候没有出现错误!!!.输出的结果为:1#include<stdio.h>intmain(){inti,k;i=ll;k=l/3*k++;printf("%d\n",k);return0;}注释:这里要强调的是:l/3*k++的的运算顺序是从左到右的,但1/3的结果为〇,再乘以任何数都是〇,最后再加上1..以下赋值不正确的是:B#include<stdio.h>intmain(){charc;c= ;printf("%d\n",c);return0;}A:'12'B:'\0X255'C:'\255'D:'a'注释:这里只有B赋值是错误的A:输出的是50;C:输出的是ー83D:输出的是97禍!!!!!!!.设有以下定义:inta=0;doubleb=1.25;charc='e';#defineD2;则下面语句中错误的是:A:a++;B:b++;C:c++;D:D++;本题的正确答案是:D注释:主要要说明:intchardouble都是可以自身加1的。而宏定义就是不可以。在这里还要强调一点就是定义常数和宏定义是不一样的,要特别注意!!!.输出的结果是:32#include<stdio.h>intmain()(intx,i,j,k;x=(i=4,j=16,k=32);printf("%d\n",x);return0;注释:经过各种不同的试验,得出x的值取决于第三个变量的值,即是最后ー个变量的值!!强调一点就是不管括号里面有多少个变量,都是娶最后ー个变量的值!!再如:#include<stdio.h>intmain()inta,b,c,num;num=(a=4,b=a+4,c=a+b);printf("%d\n",num);return0;}的结果为:12。.输出结果为:2#include<stdio.h>intmain()intnum;num=2,3/4,1;printf("%d\n",num);return0;}这里与上面的是截然相反的,是取决于第一个数。不管后面有多少数,都是取决于第一个数!!!.输出结果为:sayhi!#include<stdio.h>intmain()(printfC'tXbsayVhiWXbiX'Xn");return0;}注释:这里面肯定有有一些是不必要的,可以去掉的!!!但现在还不知道!!!夜!!!!!!!!.输出结果为:32768#include<stdio.h>intmain(){intx=32767;x=x+l;printf("%d\n";x);return0;注释:不会,是因为记不得int的范围!!!.输出的结果为:60#include<stdio.h>intmain(){intx=5;x+=x-=-x*x;printf("%d\n",x);return0;}注释:红色字体的部分要以等于号为单位,从右向左的顺序来计算!!.输出的结果为:a=6,b=6,c=ll.#include<stdio.h>intmain()(inta=5,b=6,c;printf("a=%d,b=%d,c=%d\n",++a,b++,c=a+++b);return0;}相当于下面的这段程序代码:#include<stdio.h>intmain()inta=5,b=6,c;printf("a=%d,b=%d,c=%d\n",++a,b++/c=(a++)+b);return0;}注释:尤其注意红色字体的部分。.输出的结果为:-3.29e+001#include<stdio.h>intmain()(doublex;x=-32.876554;printf("%-6.2e\n",x);return0;}注释:要搞清楚输出的格式,首先是负号是表示从左往右,接着6是表示输出的数据占6个域,点2应该表示的是保留两位小数。最后的e就不知道上面意思啦!! 要注意啦!!.输出的结果为:*3.140000,3.142*#include<stdio.h>intmain()printf("*%f,%4.3f*\n",3.14,3.1415);return0;}注释:与上题类似!!.设有“inta”, 以下不能正确表达数学关系10<a<15的表达式的是:CA:10<a<15 B:a==ll11a==1211a==1311a==14C:a>10&&a<15 D:!(a<=10&&!(a>=15))注释:这里A肯定是可以的,而B呢,因为a是整形,所以也是可以的现在来看C关于逻辑运算两边的运行结果只能是1或0,具体来看,当a为8的时候,a>10吗?不对,所以左边的表达式的值为〇,看右边的表达式a<15吗?对的。所以表达式的值为1,然后再看逻辑运算符左右两边的,综合得到最终的结果为0.那么关于D呢,慢慢看是可以看出来的!!在此不多累述!!.若有条件表达式(x)?r:b+a,则以下表达式中能完全等价于表达式(x)的是:A:(x==l) B:(x!=l)C:(x==O) D:(x!=0)参考答案为:D禍!!!!!!.输出的结果为:intmain()inta=l,b=2,c=3;if(a=O)printf("%d\n",b);elseprintf("%d\n",c);return0;}注释:尤其注意红色字体!!表达式a=0的最终结果的值为0,所以就没有执行if后面的语句!!再来ー个例题:#include<stdio.h>intmain(){intx=l,y=l,z=l;if(x=y+z)printf("$$$$");elseprintfド####");return0;}稻!!!!!!!!!.输出的结果为:3#include<stdio.h>intmain(){inta,b,c,x;a=b=c=O;x=l;if(!a)x-;elseif(b)x+=4;if(c)x-=2;elsex+=3;printf("%d\n",x);return0;}注释:这里强调的一点就是if(a)就相当于if(a==l)o特此提醒!!.输出的结果为:有语法错误,不能通过编译#include<stdio.h>intmain()(intx=l,y=2;if(x>y)x=y;y=3;elsex++;Y+=l;printf("%d,%d",x,y);return0;}注释:这里的主要原因是:if后面没有大括号,是两条语句,如果加±,就形成了复合语句这样在编译的时候就不会出现语法错误啦!!换句话说:就是else不能和if配对了!!.以下不能用作用户标识符的是:BA:-26 B:caseC:scanf D:Doublei.注释:c语言中的标识符有三类:关键字、预定义标识符、用户标识符而且我们平时所说的是用户标识符2、C中的scanf是c语言提供的数据输入库函数名,属于预定义标识符,允许作为用户标识符,但是所在程序中就不能再将scanf函数作为输入函数,因此最好避免。3、case是作为c语言中的关键字,所以不能作为用户标识符D选项中的D〇ub1e与doub1e是不一样的!!!两者是没有关系!!!.若t已经定义为d。ub1e类型,表达式:t=l,t++,t+5的值是:7.0注释:逗号表达式的运算规则是:从左往右的顺序进行;最后一个表达式的值就是逗号表达式的值。.以下四组常量中,都是合法常量的是:AA:-1 12. 0177777 0xffffB:986,012 一16〇8 0 〇・〇C:e3 .E5 -5e3.5 _0.35*10?字母D:01x0778 0xgf oXabci.注释:在C语言中,可以用来表示数值的常量有整形常量和实型常量。整形常量可以用十进制数表示,由0〜9组成,各数字之间不允许有空格及其他符号;还可以用八进制或十六进制形式表示,合法的ハ进制数只含有数字1〜7,并且第一个数字必须是数字0;合法的十六进制数只含有数字1〜9,字母a〜f(A-F),并且要用0x或(0X)开头。在c语言中,整形常量和实型常量从字面上即可区分,整形常量只用有效数字表示,且不带小数点:实型常量可以用带小数点的方式表示,也可以用指数形式表示!!!在B中,第三、四个值是合法常量,第一、二中因数字之间有逗号或空格,所以是非法常量。在C选项中,4个都是非法常量,用指数形式表示实型常量时,e或E之前一定要有数字,指数部分必须为整数C语言允许实型小数点后不加写0.在C选项中,第一、二个值虽然是以〇开头,但是数字中都含有非法ハ进制数字x和8,第三个值虽然是以0X开头。但数字中含有非法十六进制数字g,第四个值以字母。开头,所以是非法的!!!57.若题中个变量都已经正确定义并赋值,下面符合c语法的表达式的是:BA:a%=7.6; B:a++,a=7+b+cC:int(12.3)%4 D:a=c+b=a+7注释:A选项中错误有二,ー是:后面的逗号,这就成了语句了,而不是是表达式;二是:取余运算符的两边运算对象都应是整形数据,而不是实型数据。C:int应该加上括号D:在赋值号的左边存在着表达式,这是错误的!!.已有定义语句;inta=l,b=2,c=3;floatd=4;以下能正确表示数学式分子是a,分母是(b+c)*d;的C语言表达式是:DA:a/(b+c)*d B:a/(b+c)*l/dC:a/(b+c)/d D:a/d/(b+c)注释:C语言算术表达式是不可以用分数形式来表示的,可以通过使用合法的运算符、添加必要的圆括号。双目运算符两侧运算数的类型必须相同,且结果也是与其类型相同。当不一致的时候先进行转换,然后再进行计算。A选项中,明显是错误的!B选项中,先计算b+c的值,其类型是int,接着用a对其进行取整,都到的结果仍然是int类型,为〇.然后再乘以1仍为int类型的〇.最后再对d进行取整,因为d是float类型,所以在此之前先进行类型转换,两者都为double;果就是为double类型为0.0;C选项中,错误是和B中一样的,现在来说明一下D选项中的问题:首先计算b+c的值,然后运算符的优越性都相同,就只得从左往右啦!!然后要因为类型不同要需要进行类型转换啦!最后再进行计算!!.已有定义:floatx=4.6;表达式x++=x+l的运算结果是:编译时出现错误。注释:赋值号左边的必须是代表某ー个存储单元的替代名称。但决不能是表达式或常量。而在本例中赋值号左边的是x++是属于表达式的,所以这个是错误的60,已有定义,intx=3;则表达式:x=x+1.78的值是:4注释:双目运算符的两侧运算对象的类型要是不一致的话就要进行转换,而本题只有一个变量。不能将x从int向double转换,因为这就和前面的intx相互矛盾啦!!所以只有将1.78进行转换!!61.表达式:(a=b=4,a+l,b+l,a+b)的值为8注释:这里不要看a+l,b+l啦!!因为即是进行了这项操作,其操纵过所得结果也没有被保存在任何ー个变量中,就相当于没有进行这项操作一样!!.定义:intx;,执行以下语句后输出的结果是:%d,%3intx,y;x=3;V=5;printf("%%d,%%%d\n",x/y);注释:C语言规定,在格式控制串中若出现两个连续的%字符,系统将视为一个%字符进行输出,对照以上printf语句中的%%d,程序先输出ー个%,其后的d和逗号只作为格式串中的两个字符,因此输出:%d,。接着对应于“%%%d”,程序取前两个%字符输出一个字符:%,其后的“%d”作为第一个输出项x的格式符,因此输出的结果为:%3,第二个输出项y因为没有对应的格式符而无法输出!!.有以下程序段:Inta=0,b=0,c=0;Scanf(“%d”,&a);Scanf(“%d”,&b);Scanf(“%d”,&c);

执行以上语句时,从键盘输入:22执行以上语句时,从键盘输入:226.5则变量a的值:22 b的值:6c的值:0注释:注意:在进行输入操作的时候,从键盘输入的数据的存放在输入缓冲区中:第一个就不必说啦!!第二个输入的是ー个double类型的数据,在读到数字6,接着遇到了点号(.)对于整形变量来说,系统视点为非法数据,致使本次输入操作自动结束,并把6赋值给变量b,未读入的点号仍然存放在缓冲区中;在执行第三句输入语句的时候,系统在为变量c读入数据的时候,首先遇到的是已经存放在缓冲区中的点号,因为变量c也是整型,系统视点为非法数据,本次读入操作也自动结束,实际上没有给变量c读到任何的数据,c仍然保持原来的初值O.如果变量c的float类型的话,就会认为存放在缓冲区中的点号是合法的,那么就会读入给变量c赋值,那么c就会是0.5000000而就原本要赋值的9给舍掉啦!!.以下程序段:#include<stdio.h>intmain(){inta=l,b=l;scanf("a=%d,b=%d",&a,&b);printf("a=%d/b=%d\n",a/b);return0;

若:输入22,6回车键运行结果:a=l,b=l若:输入a=22,b=6回车键,运行结果:a=22,b=6注释:C语言规定,在scanf函数的格式控制串中除格式说明符之外,若还插有其他字符,则在进行数据输入的时候,必须按位置对应的原则ーー输入这些字符。对于第一种只是输入了22和6系统无法对变量进行赋值,所以变量还是保持原来的数值不变。.已有如下定义和输入语句,若希望给变量i读入ー10,j读入15,x读入10.55,则正确的输入形式是:-12,f,1.055e+lIntIJ;floatx;Scanf("%〇,%x,%e”,&l,団,&x);注释:本题主要考察,按ハ进制、十六进制输入整型数据和按指数形式输入实型数据的方法:还有就是将各个数据进行转换然后输入就可以啦!!.设x和y均为int变量,语句组:x+=y;y=x-y;x-=y;的功能是:交换x和y中的值。注释:不会!!!!!!!!.有定义语句:longa;intk;则能给a赋值40000的正确语句是:DA:3=20000+20000; B:a=4000*10;C:k=400;a=k*100;D:a=4000;a=a*10;C:k=400;a=k*100;D:a=4000;a=a*10;注释:在A、B、C选项中,在赋值号的右边都是表达式的计算结果,其值都是int类型,显然已经超出int类型两个字节的范围,系统就会仅将两个字节里面的数据即是范围在:-32768〜32767之间的数赋值给变量a;在选项口中,把4000赋值给a,是正确的int类型常量,系统将为其转换为4000L,赋值给长整型a,a=a*10时,系统先将10转换成10L,然后计算得长整型数赋值给a;.有以下程序:#include<stdio.h>intmain()(inti;floatf;longintI;doubled;i=f=l=d=20/3;printf("%d%ld%3.1f %3.1f\n",i,l,f,d);return0;}输出的结果为:6 6 6.0 6.0注释:我想在这里强调的是:20/3的取整的结果是整数!如:#include<stdio.h>intmain()inti;floatf;longintI;doubled;i=f=l=d=2O./3.;printf("%d%ld%3.1f %3.1f\n”,i,l,f,d);return0;}其输出的结果就不一样啦!!是:6 6 6.0 6.7.#include<stdio.h>intmain(){longx=-123456L;printf("\n",x);return0;}这里考察用什么样的输出格式,%d%ld%Ld输出来的都是:-123456 而%8dL输出来的就是:-123456L具体哪个是正确的海不知道,彳会!!!!!!!7〇.输出结果为:32768intmain()unsigneda=32768;intb;b=a;printf("%d\n",b);return0;}注释:答案与运行的不一样!!!解释:32768存放在无符号变量a中时,最高位为1(二进制1),其余位都是〇,赋值给int变量b时,转换为int整数,当最高位为1、其余位都是〇时,值为ー32768.71.输出结果为:1234#include<stdio.h>intmain()(inta=1234;printf("%2d\n",a);return0;}注释:这里格式说明符规定的列宽是2,但是变量a本身就要占到4个列宽,所以系统就给其安排4个列宽:再者就是C语言中规定当指定的输出宽度不足时,不影响整数部分的输出;如题目改变成:#include<stdio.h>intmain(){inta=1234;printf("%7d\n"za);return0;}则输出的就是: 1234;数字前面有三个空格!!!!再如:#include<stdio.h>intmain()(inta=1234;printf("%7d\n",a);return0;}输出的结果是:1234.56774972.输出结果为:*3.42e+004*#include<stdio.h>intmain()(doublex=34213.6894;printf("*%8.2e*\n",x);return0;}用科学计数法法表示,占8个列宽,保留两位小数。73printf("%u\n",;6);输出的结果为:4294967280.注释:答案:6542〇企!!!!!!!!!74.输出的结果为:65535#include<stdio.h>intmain()(intx=OxFFFF;printf("%d\n";x--);return0;}注释:答案是1不会!!!!!!75.输出的结果为:1#include<stdio.h>intmain()(inttl;doublet2;tl=(t2=1.9,t2+5,t2++);printf("%d\n",tl);return0;注释:这里还是没有注意到虽然在括号里面有运算,但是运算并没有重新赋值给变量t2,所以t2根本就没有改变!!.输出的结果为:a=374**a=fca=0374**a=0xfc#include<stdio.h>intmain()(inta=252;printf("a=%-5o**a=%x\n",a,a);printf("a=%#o**a=%#x\n",aza);return0;}注释:进制之间的转换已经没有了问题,在此就不说啦!!要讲的就是格式说明符的问题,在%。之间加上#说明的就是要在前面加上进制说明符。说明输出的是什么进制的数字!!.x为奇数时值为真,x为偶数时值为假的表达式是:CA:!(x%2==l) B:x%2==0C:x%2 D:!(x%2)注释:C与D根本上就不是省略形式。就是原本的样子!!C选项,当x为奇数时,x%2的值是1,结果就是!.当x为偶数时,x%2的值是。,所以满足题意!!.已定义语句:intm=O,n=l;执行表达式(m=5<3)&&(n=7>9)后,n的值是:1注释:先计算表达式m=5<3的值,结果为〇,根据“与”运算规律,只要表达式1的值为假,整个表达式的值即是假,此时不再计算表达式2的值,所以n的值不变!!.已有定义语句:int a=O,b=l,c=l;,执行语句:d=--a||++b&&--c;后a的值是:-1,b的值是:l,c的值是1,d的值是:lo注释:赋值运算符优先级最低,留着最后运算:按优先级先做式中的算式运算,然后进行“与”。最后进行“或”;算术运算从左往右应计算ーa++b-c〇首先计算ーa,结果使a变成一1.接下来做++b-c运算,但根据或运算规则。因表达式ーa,即是非零,也就是“真”,它能使整个表达式的值一定就是“真”,程序执行“短路”操作,不再对11运算符右边的表达式进行运算。#include<stdio.h>intmain()(inta=O,b=l,c=l,d;d=--aI|++b&&--c;printf("%d%d\n",a,b);printf("%d%d\n",c,d);return0;}运算输出的结果与上面的结果一致!!!.输出的结果为1#include<stdio.h>intmain(){inta=4,b=5,c=0,d;d=!a&&!b||!c;printf("%d\n",d);return0;}注释:这里由于有取反运算符,所以先计算取反运算符,从左到右依次是!a !b !c,当计算第一个取反运算符的时候,其值为假,这里有一个问题,为什么不是'‘与"的短路现象???而是都取反了以后,再根据与和或的运算规则计算!!.#include<stdio.h>intmain()(inta=4,b=5,c=100;if(a=5)c=a+b;if(a=0)c=b-a;printf("%d\n",c);return0;}注释:第一个if后面的括号里面的值是真的,所以输出的c的值是10;而第二个if后面的括号里面的值是假的,所以不执行。如果将第ー个if去掉的话,C的值将会输出原本的赋值的值即是!00;.a为〇时,值为“真”的表达式的是a==0;而a=0的表达式的值不是真的。是假的!!83,输入数字9,输出的结果为:A#include<stdio.h>intmain()(intn;scanf("%d",&n);if(n++<5)printf("%X\n",n);elseprintf("%X\n",n");return0;}.注释:在判断的时候,if后面的括号里面的计算都要计算,例如上面输入9之后,在if的后面要判断条件是否成立,然后n自身加1,如果判断的值是真的就执行其后的语句,否则不执行!!!.输出结果为:-1#include<stdio.h>intmain(){inta=O,b=O,c;if(a>b)c=l;elseif(a=b)c=0;elsec=-l;printf("%d\n",c);return0;}注释:第二个if那里出现了状况,那里得到的值是假的!!请千万注意啦!!.输出的结果为:2、3、。#include<stdio.h>intmain()(intt,a=2,b=3,c=-2;while(a>b>c)t=a;a=b;b=t;C++;}printf("%d%d%d\n"/a,b,c);return0;}注释:在这里想强调的是:红色字体部分,不要将其看着是我们平时数学里面的关系式!!切忌奥!!.输出的结果为:0、5#include<stdio.h>intmain(){intx=O,y=O;while仅<5&&++v)v--,x++;printf("%d%d\n",y,x);return0;}注释:这里强调的就是逗号在这个地方的使用。应该可以这样看,其实带下划线的オ是ー个语句,前面的实际上是半句话,不是一个句子!!.输出的结果为:1、ー2#include<stdio.h>intmain()(intx=3;do{printf("%d\n",x-=2);}while(!(--x));return0;}注释:注意输出的是什么,要看格式说明符后面的东东!!!不要心急的就看前面的,跟着感觉走,往往会出错!!.输出结果为:-1、・3#include<stdio.h>intmain(){intx=3,y=0;do(while(!y)y=-x;while(x--);printf("%d,%d\n",x,y);return0;}.下面的程序的功能是计算正整数234的各位数字之和。#include<stdio.h>intmain(){intn,sum=0;n=234;while(n){sum=sun+n%10;n=n/10;}printf("sum=%d\n",m);return0;}在横线上填什么?如果不能一下想到的话就根据,题目所给出的的选项ーー的代入到其中的横线上.输入27 76后,输出的结果为:27-858993460intmain()intn,sum;scanf("%d,%d",&n,&sum);printf("%d%d\n",n,sum);return0;}注释:注意如果输入的数据是27,76输出的结果则是27 76!!!请注意这个微小的差别!!!就是要注意在输入的时候特别在变量与变量之间是上面!!!不管是什么,在输入的时候都要加在上面!!!.以下选项中是合法的字符常量的是:AA:’、〇' B:'\x7A'C:'\' D:'\0103,注释:选项A中,是ー个字符常量。称为“空”字符,它的ASCII值为〇,在特殊的场合用它来代替之歌值为“0”的字符。选项B中X7A似乎是表示十六进制数7A,但C规定在转义字符中,反斜线后的十六进制数都只能以小写的X开头。选项C中,在单引号中是一个反斜线,因为规定转义字符由反斜线字符开头,表示一个反斜线字符常量应该写成‘\\‘。而不是‘ヽ’。选项D中是ー个转义字符常量,反斜线后面的是ハ进制数,但C规定在转义字符中,反斜线后面的ハ进制数都能是三位数!!92.输出的结果为:63#include<stdio.h>intmain(){inti=O,a=O;while(i<30){for(;;)(if((i%10)==0)break;elsei—;}i+=ll;a+=i;}printf("%d\n",a);return0;)注释:在if语句当中,当i对10取余的时候,如果if语句不成立就执行else语句,这样就使得i的值变小。其实在本题中,break语句一次都没有执行。反而是whlie使得循环得以结束!!!.输出的结果为:7#include<stdio.h>intmain()(inti;for(i=l;i++<=5;);printf("%d\n",i);return0;}注释:这里要强调的是:当i等于5的时候过来判断,符合条件,随手它就加1等于6,然后执行空语句,接着是i等于6来判断,结果不行,但是还是使其加1,不执行后面的空语句!!!如果是:#include<stdio.h>intmain(){inti;for(i=l;i++<=5;)printf("%d\n",i);return0;}则此时输出的是12 3 4 5 6,要是问执行for语句后输出的结果就是6了!!!.执行程序段后,k的值是:0.#include<stdio.h>intmain(){intr=l,n=203,k=l;do(k*=n%10*r;n/=10;r++;}while(n);printf("%d\n",k);return0;)注释:这里的错误原因在:do语句里面的n/=10;是取整的意思,误将其看成的取余了!!!.输出的结果为**I*I!intmain()inti,j;for(i=2;i>=0;i--)for(j=l;j<=i;j++)printf("*"); ①for(j=0;j<=2-i;j++)printf("I"); ②printf("\n");}return0;}注释:在此可以看出的是:的那个有两个并列的for语句的时候,要按照一个ー个的来,先完成①for语句及其以后的语句(即是执行到不能再执行的地步的时候),再来完成②。不能就是刚执行了一半就要执行下面的第二个for语句,这样做是错误的!!.输出的结果为:***##include<stdio.h>intmain()inti,j=2;for(i=l;i<=2*j;i++)switch(i/j)caseO:casel:printf("*");break;case2:printf("#");}return0;}注释:不会???!在switch语句中,如果case标号的分号后没有语句,可以将把若干个case标号和分号写在同一行上,这样的意思就是几个case共用ー个语句啦!!!例如上面的①,其实是case。和case1共用printf("巧;break;这两条语句!!!.为了给a=65,b=74,cl=A,c2=D.该怎么样输入:65A(回车)74D(回车)#include<stdio.h>intmain()(inta,b;charcl,c2;scanf("%d%c%d%c",&a,&cl,&b,&c2);printf("%d%c%d%c",a,cl,b,c2);return0;注释:在输入的时候,因为在scanf后面的括号里面没有逗号,所以在输入的时候千万不能在变量之间带有逗号。在给变量a赋值之后,要给字符变量cl赋值,就是说:要读入一个字符赋值给变量cl,所以如果在读入65之后,接着有空格或回车的话,计算机就是把空格或回车赋值给变量cl啦!强调:在给字符变量赋值的时候,特别注意,不要留有空格,一切要按照scanf语句里面的来,里面有什么就输入什么,不要多输,也不要少输。而在输入数字的时候就不需要那么麻烦啦!!可以有一个或多个空格或回车!!!.输出的结果为:***10*********#include<stdio.h>intmain()(charc='\12';printf("***%d***\n***%c***\n",c40);return0;注释:不会!!.若变量都已正确定义,执行以下程序段时,通过以下形式从第一列起依次给cl输入字母,H',给c2输入,〇’,给C3输入’!’;H《回车》0《回车》!《回车》请填空,以便正确读入。Scant(“%c”,&cl);Scanf("%c”,&c2);Scant(“%c”,&c2): 混nt(“%c”,&c3) ;Scanf("%c”,&c3^;答案为:/.若变量已正确定义并赋值,对库函数错误的调用的是:CA:k=scanf("%d%d”,&l,&j);B:printt("\\%d\\\n",k);C:getchar(ch); D:putchar(ch);注释:scant函数的调用通常以一条独立的语句的形式出现,但scant函数有函数值返回,此数表示已经输入的数据的个数。例如A选项中,如果输入了两个数字,不管数字的什么,最后输出的结果都是2.在选项B中,在printt函数的格式说明符中有两个转义字符:\\,最后将输出的结果为'k\.库函数getchar没有形参,因此在调用时ー,getchar后的ー对括号中应当是空格,函数返回一个字符!!101.#include<stdio.h>voidfun();intmain()fun();return0;}voidfun(){)注释:因为不是int或者char类型,所以必须遵守先定义后使用的原则。由于是void类型,所以在调用的时候不能有返回值赋值给变量,例如:a二fun();这样的是错误的!!.输出的结果为:5#include<stdio.h>intmain(){double*q,a=5.5;int*p,i=l;P=&i;q=&a;*p=*q;printf("i=%d\n",i);return0;}注释:*p二・q;等同于i=a;.double*w,a=3.5;int*p,i=l;P=&i;w=&a;在执行p=(int*)w;语句后,*p的值为ー个整数。要把指针变量w中的地址赋值给指针变量p,必须进行类型转换,因此语句p=(int*)w;是合法的,它使指针p也指向了变量a的起始地址。因为指针p的基类型是int,*p只取a的两个低字节中的数据,并按int类型数据存储的机制对其中的数据进行处理,因此・p是ー个整数。由于double类型数据与int类型数据存储的机制不同,因此无法估计此整数的确切值。,若有定义语句:int*q,*p;指针变量的指向如下图所示:a[0]a[l]a[2] a[3]a[4] a[5] a[6]1234567qt则值不是5的表达式是:A:*q- B:*--qC:-*q D:q-p注释:A选项,q先与・结合,就是指a[5],然后将6作为表达式的值,接着q移动指向a[4]。在选项B中,表达式・-q中,q先移动至a[4],然后取出a⑷中的值作为表达式的值。105.输出的结果为:4

#include<stdio.h>intmain()(double*w;printf("%d\n",sizeof(w));return0;)注释:#include<stdio.h>intmain()(double*w;printf("%f\n",sizeof(w));return0;}输出的结果为0.000000不会!!!!106输出的结果为:106输出的结果为:反正是数组元数的地址。#include<stdio.h>intmain()intarr[5]={23,34,54,67,l};printf("%d\n",arr+l);return0;}107.有以下定义语句:Doublet[3][3],(*pt)[3]=t;则对t数组元素错误的引用是:AA:*(pt+l)[2] B:*(pt[O]+l)C:t⑼⑵ D:(*(t))[2]注释:已知行指针pt指向t数组的首地址,选项B中表达式・(pt[O]+l)等价于・(t⑼+1),即表示数组元素t[0][l].选项C中,t⑼⑵是合法的数组元素。选项D中(*(t))⑵等价于t[0][2]. 选项A中表达式・(pt+1)⑵中,由于运算符。的优先级高于・号,表达式可转换成*(*((pt+l)+2)),变成*(*(pt+l+2))つ*(*(pt+3))つ*(pt[3])つpt⑶⑼つt⑶⑼,显然,第一个下标已越界,是错误的。.若有以下定义语句:Intl,w[3J[4]={{1.2},{3,4,5},{6,7,8,9}},*p;则以下错误的赋值语句是:BA:p=w[l]; B:w[l]=p;C:p=w[0]+2; D:p=&w[0][0];注释:指针变量p的基类型是int,二维数组w中w[i](0<=i<3)是每行的首地址,是一个常量指针,它的基类型也是int。因此A、C、D都是合法的。选项B中,因w[l]是ー个常量指针,不能给它赋值,所以赋值语句w[l]=p;是错误的。.若主函数中有以下定义和语句:Main()(Doublea[3][4];Fun(a);}则正确的fun函数的首部是:DA:voidfun(double*s) B:fun(double*s[4])C:fun(double(*s)[3]) D:voidfun(double(*s)[4])注释:调用语句Fun(a);没有返回值,因此函数的类型可以是void类型,也可以是int类型、调用语句中的实参a是一个3行4列的二维数组名,这是ー个地址常量,所以对应的形参应当是ー个行指针。A选项中,其形参是一个基类型为double的指针变量,不是行指针。因此是错误的。 B选项中,其形参是ー个指向基类型为double指针的指针,它等同于fun(double*sロ)或fun(double**s),s不是行指针。C选项中,形参(*s)[3]表示s是一个行指针,但此行指针的基类型是ー个指向具有3个double元素的数组,而实参a每行有4个元素,因此类型不正确。.若二维数组a有m歹リ,则计算任一元素在数组中的位置的公式为:i*m+j(假设a⑼⑼位于数组的第一个位置上)注释:不0!!.chararr[]="resultO";则数组arr所占的空间为8个字节。注释:因为在"result。"的〇后面还有一个空字符。所以总共8个字节。.chararr[5]={"abcdrf"); 是错误的,因为给arr赋值的内容已经超过了范围了。数据就会溢出!.输入123 456 <779>,输出的结果为:1,23,456#include<stdio.h>intmain()(chars[100];intc,i;scanf("%c%d%s",&c,&i,s);printf("%c,%dz&s\n";c,i,s);return0;}注释:第一输入的是字符,当c遇到1的时候,就将其赋值给变量c了,不会再看后面有没有其他什么的了,然后剩下来的23,因为23后面有空格,所以系统就认为到23的后面就截止了,所以就只把23赋值给变量1了,接着就要给字符串s赋值了,系统看到在23的后面是345,可以作为字符串赋值给字符串变量s,所以就这样做了。结果就是不再顾后面的<779>啦!.输入ABC,输出的结果为:ABC#include<stdio.h>intmain(){chars[10]="12345";gets(s);printf("%s\n",s);return0;}注释:不会!!!为什么不是ABC45????.输出的结果为:6#include<stdio.h>#include<string.h>intmain(){chars[]="qq\n\012\\\n";printf("%d\n",strlen(s));return0;)#include<stdio.h>#include<string.h>intmain(){charstr[7]="tudent",c;intk;for(k=l;(c=str[k])!='\0';k++)(switch(c)(case't':putchar('#');case'n':putchar('$');break;default:continue;}putchar('*');)return0;)注释:不难的!!可以做出来的!!117.输出的结果为:012 3#include<stdio.h>fun(intb)(if(b>0)fun(b-l);printf("%d",b);}intmain()(inta=5;fun(a);printf("\n");return0;)注意:调用的顺序!和输出的顺序!!.输出的结果为:4#include<stdio.h>f(inta){intb=0;staticc=3;a=c++;b++;returna;}intmain(){inta=2,i,k;for(i=0;i<2;i++)k=f(a++);printf("%d\n",k);return0;}注释:这里有一个静态变量c,在程序结束之前它都会保持变量的值不变的,当然不是一成不变的,意思就是不释放存储空间。保持上ー次运算的结果。.输出的结果为992003 4 5 0 6 7#include<stdio.h>voidfun(ints[])(inti;for(i=0;i<10;i++)printf("%d",s[i]);printf("\n\n");intmain(){inta[3][4]={{99,2},{3,4,5},{6,7,8}};fun(a[O]);return0;}注释:在这里传递的是数组的地址,而接收是ー个指针变量。呵呵就是这样啦!!例如:将下面的程序执行了之后的输出的结果为#include<stdio.h>voidfun(ints[])(inti;for(i=0;i<10;i++)printf("%d",s[i]);printf("\n\n");)intmain()inta[3][4]={{99,2},{3,4,5},{6,7,8}};fun(a[l]);return0;}3 4 5 0 6 7 8 还有两个是未知的,只能输出的就是那么多是确定的.若有以下定义语句:doublea[5],*p=a;则对不正确表示a数组元素地址的表达式是:CA:++p B:&p[4] C:++a D:a注释:C选项中企图移动++a,这是不允许的,数组名是地址常量,不可以进行++a运算。.输出的结果为:字符‘2’的地址。#include<stdio.h>intmain(){char*k="12345";k+=l;printf("%d\n",k);return0;}注释:k是ー个指向字符的指针,当用%d输出时输出的就是所指字符的地址啦!!如:#include<stdio.h>intmain()char*k="12345";k+=l;printf("%s\n",k);return0;}此时输出的结果为:2345不是地址啦!!!.输出的结果为:#include<string.h>#include<stdio.h>intmain(){charsl[]="123",s2[]="abc",ss[20]="010";strcat(ss+4,strcpy(s2,sl));printf("%s\n",ss);return0;)注释:连接函数都是把后一个从前ー个的结束标识符开始的。了解字符串连接函数和字符串拷贝函数的作用,连接是将后一个连接带前一个的后面,但是呢前ー个的存储空间必须足够大,以便于放下原来和后加进来的两个字符串的大小。而字符串拷贝函数呢,是将后一个字符串覆盖到前ー个字符串的上面,前ー个的空间必须能够容纳后一个的字符串的。当后一个小于前ー个字符串的实际长度的话,则前ー个的剩余部分也被覆盖而不能输出。问题:这里的+4是干什么用的??猜想:不管加上几,只要所指的地址在结束标识符的前面就可以啦!!.输出的结果为:1315#include<string.h>#include<stdio.h>intm=l;voidfun(int*n)(staticintm=2;*n*=m-l;m+=2;}intmain()(inti;for(i=l;i<4;i++)fun(&m);return0;}注释:其实是输出了3个值,只是没有分隔符,所以就连在了一起。其实就是1 3 15三个数啦!!.输出的结果为:6 , 4#include<string.h>#include<stdio.h>intmain()(inti=2,k=2,m;m=(k+=i*=k);printf("%d,%d\n"/m/i);return0;}注释:其实在这里呢,就是有几个等于号就有几个语句,这些个语句和在ー起构成了一个看似复杂的语句,我们只要把他们还原就可以啦!将其转变成原来的样子就好做啦!!.设有以下结构体的定义:Structww{intno;charname[10];};Structwwcc[4]={l,"apple”,2,"bananagrape”,4,”orange"};则以下能够输出字符串“grape”的语句是:BA:printf(u%s\n",cc[2].&name[0]);printf(u%s\n",&cc[2].name);printf(u%s\n",cc[2].&name);printf(u%s\n",cc[2].name[0]);注释:选项A和C的输出项中,在点号(。)运算符后加上了&运算符是不符合语法规则的。B选项中即使是不加&也是正确的。选项D中,cc[2].name[0]输出的是成员数组name的第0个元素。即是字母'g',而不是存放字符串地址.输出的结果为:256#include<stdio.h>union(charm[2];intk;}mk;intmain(){mk.m[0]=0;printf("%d\n",mk.k);return0;}注释:在给2个元素赋值之后的存储状态如下图:Mk.m[l] mk.m[0]0000000100000000Mk.k由于共用存储单元,当输出成员mk.k时ー,系统将按照整型来解释上述存储空间中的数据,第九位为1,则28=256.输出的结果为:0#include<string.h>#include<stdio.h>union(intnum;struct(charcl,c2;}sc;}lun;intmain()Iun.sc.cl=65;Iun.sc.c2=97;lun.num=O;printf("%d\n"Jun.sc.c2);return0;}注释:共用体变量中起作用的是最近一次存入的成员的值,原有成员的值被覆盖!!!这里的是结构体和共用体在ー起的题,特别注意到!!!其中共用体所占的内存是其成员中最大的ー个!这里最大的是int类型,占两个字节。要是没有对num的赋值,那么对ClC2的输出就没有问题啦!128.输出的结果为:2030 88#include<stdio.h>intmain(){FILE*fp;inti=20,j=30,k=99,n=88;fp=fopen("d:\\d16_3.dat","w");fprintf(fp,"%d"/i);fprintf(fp,"%d"j);fclose(fp);fp=fopen("d:\\dl6_3.dat","r");fscanf(fp,"%d%d",&k,&n);printf("%d%d'',k,n);fclose(fp);return0;}注释:在d根目录下新建了一个名为dl6_3.dat文本文件,并通过fprint函数输出20和30,在这两个数中间并没有加入任何间隔符,在文件中两数以2030这样的形式存放,输出后文件被关闭。文件随后以读的方式被打开,用fscanftp/佻c^cr.&k&n);语句从文件中读取数据,变量从文件中读入2030,变量n没有读到数据,所以只能保持原来数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论