C语言的4个选择题,帮忙解释一下答案,谢谢!

2024-11-05 16:30:44
推荐回答(5个)
回答1:

第一题:
c=getchar()表示计算机获得一个输入的字符并把它赋给int型的c(在1~256之间int和char可以相互赋值).首先接收字符2,把2赋给c,while(c=getchar())!='\n')表示只要输入的字符不是enter键就执行while里面的循环体。 而
switch(c-‘2’)
{
case 0:
case 1: putchar(c+4);
case 2: putchar(c+4);break;
case 3: putchar(c+3);
default: putchar(c+2);break;
}
的执行过程是这样的:首先计算‘c'-2的值,只要该值与下面的那个case 后的表达式相同就执行其后的语句,比如说读入的第一个字符2,2-2=0,此时执行case 0 后面的语句,而case 0与case 1后面的语句是同一个语句,所以执行 putchar(c+4);输出6,由于
case 1: putchar(c+4);后面没有break;语句,所以继续执行其后语句,直到遇到break语句或执行完所有语句为止,为此第二个也输出6,因为case 2后有break语句,所以结束第一次循环,之后输入的473的原理也是这样的。
第二题:
for循环的一般形式是for(表达式1;表达式2;表达式3){循环体}表达式1相当于赋初值,其作用只有一次,而表达式2是判断条件,只要表达式2不为0就执行循环体,执行完循环体后在执行表达式3,这是一个完整的循环,接着又判断表达式2的值是否为零,不为零,又执行循环体,......
因为此题中i=2不等于0,所以表达式2 的值为0;因此一次也不执行。
第三题:
参阅第二题解析。
第四题:
*p=&x[1][1];表示把元素5的地址赋给了指针p;
for(i=0;i<4;i+=2)printf("%d ",p[i]);
第一次,i=0;输出p[1][1],第二次i=2,此时使p向后移动两个元素,因此输出3

回答2:

1. 缓冲区中输入“2473”
while第一次循环:c=2,执行case 0;因为没有break,所以顺序执行case 1: putchar(c+4);【输出6】 仍然没有break ,继续执行case 2: putchar(c+4);break;【输出6】break跳出本次循环;
while第二次循环:c=4,执行case 2: putchar(c+4);break;【输出8】break跳出本次循环;
while第三次循环:c=7,执行default: putchar(c+2);break;【输出9】break跳出本次循环;
while第四次循环:c=3,执行case 1: putchar(c+4);【输出7】没有break ,继续执行case 2: putchar(c+4);break;【输出7】break跳出本次循环;
本题主重点是switch,case语句中如果case后没有break语句,则顺序执行,直至break跳出。
while循环结束,输出换行符,程序结束,最后显示的就是668977.
2. 程序的意思是i的初始值为2,如果i的值为0,则输出i后i-1,直至i不为0,跳出循环,程序结束。因为i的初始值就不符合循环条件,所以执行次数为0。
本题的重点是for循环语句是先判断执行条件后执行循环。
3.程序的意思是i的初始值为0,如果x>8,则输出x,y后,x=x-1, i=i+1,y=i。
第一次 i=0 , x=10, y=10,
第二次 i=1, x=9, y=1
第三次,x=8,不符合循环条件,不执行循环体,跳出循环。
本题的重点是for循环语句的执行顺序:首先变量赋初值【第一个分号前的语句】然后判断循环条件【两个分号中间的语句】如果为假,跳出循环,反之执行循环体,最后执行第二个分号后的语句,然后重新判断是否循环。
4. x为二维数组,其值如下:
x[0][0]=9, x[0][1]=8, x[0][2]=7
x[1][0]=6 ,x[1][1]=5, x[1][2]=4
x[2][0]=3, x[2][1]=2, x[2][2]=1
p[0]指向x[1][1]=5,p[1]顺序下推,指向x[1][2]=4,p[2]指向x[2][0]=3在循环中输出p[0]和p[2]
结果为5,3
本题关键在于在c语言中二维数组的值是按行连续存放的,而指针数组如果只给p[0]赋值。其他没有具体赋值,那么指针p[i]指向的地址是p[0]+指针类型所占的空间数×i,本题中数组和指针都为int,所以p[i]中i每加1就相当于沿数组行移动一个

回答3:

1、输入:2 c=2 c-'2'=’0‘ 输出执行:case 0:
case 1: putchar(c+4);
case 2: putchar(c+4);break;
即遇到break为止。
输入: 4 c=4 c-'2'=’2‘ 输出执行: case 2: putchar(c+4);break;
输入: 7 c=7 c-'2'=’5‘ 输出执行: default: putchar(c+2);break;
输入: 3 c=3 c-'2'=’1‘ 输出执行: case 1: putchar(c+4);
case 2: putchar(c+4);break;
即:66 8 9 77

2、for(x;y;z)循环执行x,再判断是否满足y条件,满足则循环执行一次,再执行z;再判断y是否成立,直到y不成立了,循环结束。 这一题一开始i=2,不满足i= =0,所以就一次都不执行了。

3、 第一次循环: i=0,x=10,x>8,输出10 10 后,x=9,y=1,i=1
第二次循环: i=1,x=9,x>8,输出 9 1 后,x=8,y=2,i=2
第三次循环: i=2,x=8,x>8不成立,循环结束。

注:对于y=x++和z=++x,应遵循:前变后不变,自身都改变。即x=2时,y=x=2,x=3 ; x=3;z=x=3

4、p[0]=x[1][1]=5 p[2]=x[2][0]=3
具体有: x[0][0]=9, x[0][1]=8, x[0][2]=7
x[1][0]=6 ,x[1][1]=5, x[1][2]=4
x[2][0]=3, x[2][1]=2, x[2][2]=1
p[0]=a[1][1], p[1]=x[1][2], p[2]=x[2][0], 以此类推

回答4:

第一题:当输入的不是回车时执行switch程序
c='2' c-'2'=0 从case 0开始执行到case 2:后的break语句 此时c='2'+4='6',输出字符6
连续两次输出'6'
再读入c='4', '4'-'2'=2,从case 2开始执行到后的break语句中止 此时c='4'+4='8',输出字符8
接着读入c='7','7'-'2'=5,后面没有相应的序号,所以执行default 输出字符9
再读入c='3', '3'-'2'=1,从case 0开始执行直到case 2后的break为此,即输出两个字符7
最后读入回车,循环结束
所以答案是668977
第二题:因为2==0为假,不成立,逻辑值为0,不循环,所以为0

回答5:

第一道题:
缓冲区里输入2437
while循环一次读出~
第一次读出‘2’
‘2’-’2‘ = 0;执行switch里面语句得出66
第二次读出4
’4‘-’2‘ = 2 执行switch语句读出8;
依次执行下去得出结果

第二题 i=2 。 i==0 因为2!=0 所以返回假 不执行循环 0次~

第三题
第一次X--,y 得出 10,10 以后x--编程9 y进入循环执行得1 在打印一次得到9,1

第四题 *p = &x[1][1] 表明p指向1 执行两次 第一次执行p[0]也就是他的首地址p[1][1] 得到5
第二次p[2]就是p+2 后两个元素 也就是3~