冲刺必看!名师讲解二级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