请高人们解答几条二级试题

来源:百度知道 编辑:UC知道 时间:2024/06/27 23:50:29
1.fun(int x,int y){return(x+y);}
main()
{int a=1,b=2,c=3,sum;
sum=fun((a++,b++b,a+b),c++);
printf("%d\n",sum);
}
执行后的输出结果是________。
A)6 B)7 C)8 D)9 (答案是C)

2.main()
{ char s[ ]= "abcde";
s+=2;
printf("%d\n",s[0]);
}
执行后的结果是________。
A)输出字符a的ASCII码 B)输出字符c的ASCII码
C)输出字符c D)程序出错 (答案是: A)

3.若有定义:int w[3][5];,则以下不能正确表示该数组元素的表达式是________。
A)*(*w+3) B)*(w+1)[4] C)*(*(w+1)) D)*(&w[0][0]+1)
(答案是A)

4.有以下程序
void change(int k[ ]){k[0]=k[5];}
main()
{int x[10]={1,2,3,4,5,6,7,8,9,10},n=0
while(n<=4) {change(&x[n]);n++;}
for(n=0;n<5;n++) printf("%d",x[n]);
printf("\n");
}
程序运行后输出的结果是________。
A)678910 B)13579 C)12345 D)62345 (这题我选的是D,答案是A)
请高手详细解答以上几道题目,非常感谢~~!

1.fun((a++,b++b,a+b),c++);
b++b?? 是否笔误?
(a++,b++b,a+b)中,","运算符,从左到右,所以先a++,然后b++b,最后得到a+b的值,然后将其值和c值一起传入fun(...),理解为b++或++b的话,结果应该为8才对.

2.s+=2;
s是数组名,相当于常量指针,无法修改其指向,这句在89标准是编不过的,不知道C99如何.

3.*(*w+3)
int w[3][5];
w[0]-w[2],这里出了w[3],自然错了.

4.void change(int k[ ]){k[0]=k[5];}
change函数是将第五个元素的值直接赋给了第一个元素,
while(n<=4) {change(&x[n]);n++;}
传入前5个元素的起始地址,所以前5个元素分别修改为了:0+5,1+5,2+5,3+5,4+5,由此可知答案为A.

1、fun((a++,b++b,a+b),c++);
(a++,b++b,a+b)是逗号表达式,结果是最后的表达式,即a+b,而计算顺序是从左到右,即计算时a++后,a为2,b++后,b为3,所以a+b为5,再加c(3),所以为8;

2、char s[ ],s为字符数组的首地址,即一个指针。
反正答案不对,是D,或者B,反正不应该是a

3、*(*w+3)就是w[3][0],越界!

4、5次对换,
1-6,2-7,3-8,4-9,5-10

第一道sum=fun((a++,b++b,a+b),c++);
这里少了一个 + 号应该是b+++b才行,答案是8
(a++,b+++b,a+b)这个是逗号表达式取a+b的值7,b+++b意思是b+(++b)b先加1再两个3相加,a++是算完这个式子后a再加1.
第二题应该是D吧。不可能是A的。
3选A没错,那个表达式应该是不允许的,他会指向未知的地方。
4选的是A最后的数组