全国计算机等级考试二级C模拟试题(3)
(18)下面这个程序段的输出结果是
int a = 1234;
printf("%2d\n ",a);
A)12
B)34
C)1234
D)提示错误且无结果
[答案]C
[解析printf()函数的输出格式,本题中的整数时,要求输出两位有效数字,但实际上A有四位有效数字,所以照原样输出,输出1234。
(19)下列选项中不属于C语言类型的有
a)有符号short int
b)无符号long int
c)无符号int
D)long short
[答案]D
[解析
(20)如果有解释性语句:int a,b,c,* d = & c;那么能从键盘正确读取三个整数并赋给变量A,B,C的语句是
A)scanf("%d%d%d ",&a,&b,d);
B)scanf("%d%d%d ",&a,&b,& d);
C)scanf("%d%d%d ",a,b,d);
D)scanf("%d%d%d ",a,b,* D);
[答案]A
[解决方法scanf()函数有两个参数。第一个参数是输入格式字符串,第二个参数是输入变量的地址列表。输入格式字符串主要由“%”符号和格式字符组成。地址列表由多个地址组成。选项B中,D已经是地址了,所以不要加地址符号“& ”;选项C中,A和B都是变量而不是地址,A和B前要加地址符号“& ”;选项D中指针D指向的storage 空之间的位置是变量C的值,而不是地址。
(21)在16位c编译器系统上,如果定义了长a;,能把40000赋给A的正确说法是
A)A = 20000+20000;
B)a = 4000 * 10;
C)a = 30000+10000;
D)a = 4000 l * 10L;
[答案]D
[解决方法]由于20000+20000、4000*10、30000+10000都是整数表达式,运算的结果仍然是整数,表达式运算的结果超出了整数数据的范围,这是不正确的。而d是长整数运算,不会超出长整数的范围。
(22)下列说法正确的是
A) define和if可以定义为用户标识符
B) define可以定义为用户标识符,但if不能定义为用户标识符
C) define可以定义为用户标识符,但不能定义
d)既不define也不能定义if。用户标识符不允许使用保留字。
(23)如果定义:int a=511,* b = & a;然后printf ("%d \ n ",* b);输出结果是
A)A的地址
B)a没有确定值
C)512
D)511
[答案]D
[解析]本题先定义一个int变量A并赋值,
(24)下面这个程序的输出结果是
main ()
{int a = 5,b = 4,c = 6,d;
printf(("%d\n ",d=a>b?)(a>c?甲:丙):(乙));
}
A)5
B)4
C)6
D)不确定
[答案]C
[解析]C语言中的问号表达式(例如:A A:C;)的计算规则是:如果A > C为真,那么表达式的值就是A的值;否则表达式的值就是c的值,对于本题printf()函数中的输出表达式,先计算括号中的条件表达式,其值为6 (a > c?a:在c中,a > c,即5 > 6为假,所以这个表达式的值为c,即6),然后计算外部表达式(相当于a > b?6:b),同理,这个表达式的值是6,把值6赋给D,那么最后这个表达式的值就是6。
(25)在下面的程序中,while循环的次数是
main()
{ int I = 0;
while (i<10)
{ if(i<1)继续;
if(I = = 5)break;
i++;
}
……
}
a)1
b)10
c)6
d)无限循环,次数无法确定
[答案]d当break出现在循环体中,而不在switch语句体中时,在break执行完毕后会跳出本级循环体。continue语句的作用是结束这个循环,即跳过这个循环中剩余的未执行的语句,然后再次进行循环的条件判断。在这个程序中,变量I的初始值为0,while后括号中的表达式的值被判断为真,循环体中的if语句被执行,if后括号中的表达式的值被判断为真,并“continue;"声明。因为continue的作用是结束这个循环,也就是跳过这个循环中剩余未执行的语句,然后再次对循环进行条件判断,I的值没有变化,循环条件仍然为真,if语句仍然有效,所以循环会无限继续下去。
(26)下面这个程序的输出结果是
main()
{int a=0,I;
for(I = 1;I < 5;i++)
{ switch(i)
{情况0:
情况3:a+= 2;
情况一:
情况二:a+= 3;
默认值:a+= 5;
}
}
printf(" % d \ n ",a);
}
A)31
B)13
C)10
D)20
[答案]A
[case]switch语句的执行过程是:在switch之后,如果该语句之后没有break语句,则继续按顺序执行下一个case分支,直到break语句或switch多分支语句结束。在switch语句中,break语句用于使进程跳出switch结构,终止switch语句的执行。在这个问题中,因为每个case语句后没有break语句,所以A的值在第一轮后为8(I = = 1),第二轮后为16(I = = 2),第三轮后为26(I = = 3),第四轮后为26(I = = 4)。
(27)下面这个程序的输出结果是
main ()
{int a = 4,b = 5,c = 0,d;
d=!一&&!b‖!c;
printf("%d\n ",d);
}
A)1
b)0
c)一个非零数
D)-1
[答案]A
[解析]因为一元运算符的优先级比“& a,b!c是false,false,true,后面是&&运算和||运算。原始表达式等效于false & & false || true,由于& &优先于||运算符,因此首先计算false & &的值。所以最后d赋值为1,所以最后输出是1。
(28)下面这个程序的输出结果是
# include < stdio . h >
main()
{ int I = 0,a = 0;
while(I < 20)
{ for(;;)
{ if((I % 10)= = 0)break;
else I-;
}
I+= 11;a+= I;
}
printf("%d\n ",a);
}
A)21
B)32
C)33
D)11
[答案]B
[解析] break语句只能用在loop和switch语句体中。这个程序将在while循环中嵌套一个for循环。先看内部for循环。循环的三个表达式全部省略,循环条件始终为真,但循环中的break语句是终止循环的条件。先根据初始条件判断外循环while括号中表达式的值,值为真。执行这个while循环,即执行循环内部的if语句,判断表达式后面括号中的表达式的值为真,执行break语句,跳出内循环,执行下面的语句。这时,I和A的值都变成11;回到外循环,判断表达式“I < 20”仍然为真,执行内循环语句。此时,如果条件不满足,执行else语句,I的值为10。继续内部循环。如果满足条件,执行break语句并跳出内循环。执行以下语句后,I和A的值分别为21和32。判断外循环的条件为假,结束循环。(29)下面这个程序的输出结果是
charcchar(charch)
{
if(ch > = ' a ' & & ch < = ' z ')ch = ch-' a '+' a ';
return ch;
}
main()
{ char s[]= " ABC+ABC = defDEF ",* p = s;
while(* p)
{ * p = cchar(* p);
p++;
}
printf("%s\n ",s);
}
a)Abd+ABC = def def
b)ABC+ABC = def def
c)abcacdef
d)abcacdef[/br][答案]b[/br]在函数中,首先判断字符是否为大写字母,如果是,将其转换为小写字母,然后赋给ch,返回ch作为函数值。在main函数中定义并初始化一个字符数组S,然后定义一个指针变量指向数组S,然后通过一个while循环,用指针变量P依次取出字符数组的字符(直到遇到字符串结束符' [11] '),调用cchar()函数将大写字母转换成小写字母,其他字符保持不变。最后输出的字符数组是s中的内容,结果是“abc+abc=defdef”。
(30)下面这个程序的输出结果是
int f()
{ static int I = 0;
int s = 1;
s+= I;i++;
return s;
}
main()
{ int i,a = 0;
for(I = 0;I < 5;i++)a+= f();
printf("%d\n ",a);
}
A)20
B)24
C)25
D)15
[答案]D
[解析]C语言中声明为静态的变量即使在退出函数后,静态局部变量在下次进入函数时仍然使用原来的存储单元。因为这些存储单元没有被释放,所以这些存储单元中的值被保留;因此,存储单元中的原始值可以继续使用。在这个问题中,函数f()定义了一个静态变量I,所以每调用一次函数f()I的值就增加1,返回S的值等于I,在主函数中使用了一个for循环,执行五次,每次f()的返回值都加到变量A中,所以A的最终值是1+2+3+4+5 = 11。
(31)以下程序段的输出结果为
char s[]= " \ \ 141 \ 141 ABC \ t ";
printf("%d\n ",strlen(s));
A)9
B)12
C)13
D)14
[答案]A
[解析]字符串可以存储在一个字符数组中,但字符数组的长度不是字符串的长度,是字符串的长度。数组S中存储的字符依次为' \ \ '、' 1 '、' 4 '、' 1 '、' 141 '、' a '、' b '、' c '、' t ',最后一个字符串结束标记为' [13] ',所以字符串的长度为9。
(32)如果有以下程序
# include < stdio . h >
void f(int n);
main()
{ void f(int n);
f(5);
}
void f(int n)
{ printf(" % d \ n ",n);}
下列说法中不正确的是
A)如果只在主函数中描述函数f,则只能在主函数中正确调用函数f
b)如果在主函数之前描述函数f,则可以在主函数和其他后续函数中正确调用函数f
c)对于上述程序,系统是编译的。提示反复解释f函数
D)函数f没有返回值,可以用void定义为无值
[答案]C
[解析]如果一个函数是在主调函数之后定义的,其返回值不是int或char,则必须说明。可以在函数外解释,也可以在函数内解释。如果在函数之外解释,后续所有函数都可以调用该函数。如果在函数内部解释,只能在函数内部调用。一个函数只能定义一次,但函数描述可以出现多次。
(33)下面的程序调用findmax函数返回数组中的值
findmax (int * a,int n)
{int * p,* s;
for (p=a,s = a;p-a < n;p++)
if()s = p;
return(* s);
}
main()
{ int x[5]= { 12,21,13,6,18 };
printf("%d\n ",findmax(x,5));
}
A)p > s
b)* p > * s
c)A[p]> A[s]
d)p-A应填入下划线。调用时,数组元素X的第一个地址传递给参数指针变量A,5传递给参数n,在函数findmax()中,定义了两个指针变量P和S,其中S用来记录一个元素的地址,P作为循环控制变量来表示每个元素的地址。求值的算法是先取第五个元素(用s写下它的地址)作为值,然后将值(*s)与后面的每个元素(*p)进行比较。如果后续元素很大,用s写下它的地址,所以下划线应该是“* s < * p”或者“* p > * s”。
(34)下面这个程序的输出结果是
main()
{ charch[3][5]= { " AAAA "," BBB "," CC " };
printf(" % s " \ n ",ch[1]);
}
A)" AAAA "/br/]B)" BBB "/br/]C)" BBBCC "/br/]D)" CC "/br/][答案] B
[首先定义一个数组ch[3][5],按行给它们赋值初始值,相当于给ch[0]赋值“AAAA”,给ch[1]赋值“BBB”,给ch[2]赋值“BBB”。最后输出转义字符“' \ '”、ch[1]和escape。
0条评论