冲刺必看!名师讲解二级C真题之选择题(3)
技术与开发
本期点评的选择题是试卷最后部分的选择题,难度较大,很多考生在此处失分。快来看看这些试题你都可以得分吗?
第35题:有以下程序
#include
int fun(char s[])
{int n=0;
while(*s<='9'&&*s>='0') {n=10*n+*s-'0';s++;}
return(n);
}
main()
{char s[10]={'6','1','*','4','*','9','*','0','*'};
printf("%d\n",fun(s));
}
程序运行的结果是
A)9 B)61490 C)61 D)5
本题难度:较难
涉及知识:指针
专家解析:题中fun函数功能是将s字符串中的数字字符部分转换为数值常量。函数中形参为数组时,形参实质上是一个指针变量,即指向实参所对应的地址。形参s指针变量,指向实参的s数组。While循环实现对数组元素值的读取,一旦遇到非数值字符,立即结束循环。所以,s数组中只有6与1二个字符进行了转换。*s-'0'为数值字符转换为数值常量。
第38题:有以下程序
#include
void fun(char *t,char *s)
{while (*t!=0)t++;
while((*t++=*s++)!=0);
}
main()
{char ss[10]="acc",aa[10]="bbxxyy";
fun(ss,aa);
printf("%s,%s\n",ss,aa);
}
程序的运行结果是
A)accxyy,bbxxyy B)acc,bbxxyy
C)accxxyy,bbxxyy D)acbbxxyy,bbxxyy
本题难度:很难
涉及知识:知识点复合
专家解析:本题中fun函数的功能等同于字符串函数strcat,实现将字符串aa连接到字符串ss的末尾。形参t和s指针变量分别指向字符串ss和aa。第一个while循环,将t指针变量指向字符串ss的结束符'\0'。第二个while循环实现从字符串ss的末尾处开始将字符串aa中的字符(包含'\0')逐个复制到字符串ss中(编者注:ss原结束符被覆盖了)。
第41题:有以下程序
#include
int a=1;
int f(int c)
{static int a=2;
c=c+1;
return (a++)+c;
}
main()
{int I,k=0;
for(I=0;I<2;I++){int a=3;k+=f(a);}
k+=a;
printf("%d\n",k);
}
程序的运行结果是
A)14 B)15 C)16 D)17
本题难度:很难
涉及知识: 全局变量、局部变量、局部静态变量的作用域
专家解析:这道题的知识点比较偏,考生易疏忽丢分。题中定义了多个变量a,它们的类型以及作用域都不相同。“int a=1;”语句所定义的a变量为全局变量;“static int a=2;”语句所定义的a变量为局部静态变量;“int a=3;”语句所定义的a变量为局部变量。
第43题:若程序中有宏定义行:#define N 100 ,则以下叙述中正确的是
A)宏定义行中定义了标识符N的值为整数100
B)在编译程序对C源程序进行预处理时用100替换标识符N
C)对C源程序进行编译时用100替换标识符N
D)在运行时用100替换标识符N
本题难度:很难
涉及知识:预处理命令
专家解析:此题考生失分的很多。包含宏命令的C程序在进行编译之前,都要先进行预处理,即对程序中所有出现的“宏名”,都用宏定义中的字符串进行替换。答案A的错误在于宏定义的作用不是定义标识符N的值,而是用标识符N来代替100这个整数;C答案和D答案的错误在于编译前进行预处理时才用100替换标识符N。
第48题:有以下程序
#include
main()
{ int a=1,b=2,c=3,x;
x=(a^b)&c;
printf("%d\n",x);
}
程序的运行结果是
A)0 B)1 C)2 D)3
本题难度:很难
涉及知识:位运算
专家解析:C语言学习中比较疏忽的知识点,考生遇到此类题,经常无从入手。首先,将1、2、3的二进制表示形式分别写出:00000001、00000010、00000011。然后,计算a^b=1^2=00000011,再将其与3进行“与”运算,结果为00000011(十进制表示就是3)。
第35题答案:C
第38题答案:D
第41题答案:A
第43题答案:B
第48题答案:D