弯道超车必做好题集锦三(C语言选择题)

前言:

编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,每篇大约10题左右。此为第三篇选择题篇,该系列会不定期更新,后续还会开编程题的系列。敬请期待!


1 、请阅读以下程序,其运行结果是()
int main ()
{
char c = 'A' ;
if ( '0' <= c <= '9' ) printf ( "YES" );
else printf ( "NO" );
return 0 ;
}

A: YES          B: NO              C: YESNO           D: 语句错误  

答案解析:
正确答案: A
'0'<=c<='9' 并非判断 x 大于等于字符 0, 小于等于字符 9 ,而是先执行 '0'<=c ,使用这个表达式的结果再和 '9' 比较, '0' ASCII 码值是48 'A' ASCII 码值是 '65' ,故 '0'<c 是真值 1 1 无疑是小于字符 '9' 的,最终是真

2.假设编译器规定 int short 类型长度分别为32位和16位,若有下列C语言语句,则 y 的机器数为( )

unsigned short x = 65530 ;
unsigned int y = x ;

A: 0000 7FFA          B: 0000 FFFA              C: FFFF 7FFA               D: FFFF FFFA 

答案解析:
正确答案: B
unsigned short 类型的 x 变量 2 个字节保存了 65530 ,十六进制形式为 0xFFFA x y 赋值时会整型提升,而无符号数在提升时 高位补0 ,其实就相当于把 x 的值放在了 y 的低 2 个字节的空间中,故选 B

3.下列程序的输出结果是什么()

#include<stdio.h>
int main ()
{
int n = 1001 ;
int ans = 0 ;
for ( int i = 1 ; i <= n ; ++ i )
{
ans ^ = i % 3 ;
}
printf ( "%d" , ans );
return 0 ;
} 

A: -2                  B: 0              C: 1                   D: 2  

答案解析:
正确答案: B
i % 3 的值按 1 2 0 循环,可推算出 ans 1 3 3 2 0 0 循环,循环进行 1001 次,而 1001%6=5 ,也就是 ans 按规律得到 的第5 个数为最终结果,故 ans=0

4.要使 a 的低四位翻转,需要进行操作是( )

A: a|0xF                B: a&0xF                C: a^0xF               D: ~a 

答案解析:
正确答案: C
十六进制数 0xF 4 1 ,参与运算时整型提升,高位都是 0 。低四位和 1 异或, 0^1 1 1^1 0 ;高位和 0 异或, 0^0 0 1^0是1 。故而可以通过异或 F 使得 a 的低四位翻转,并保持高位不变

 5.如果 x=2014 ,下面函数的返回值是( )

int fun ( unsigned int x )
{
int n = 0 ;
while ( x + 1 )
{
n ++ ;
x = x | ( x + 1 );
}
return n ;
}

A: 20          B: 21              C: 23                D 25  

答案解析:
正确答案: C
这个作用是对整型中 0 的个数进行统计, x=x|(x+1); 的作用是每次循环把 x 的二进制中从右往左数的最后一位 0 变成 1 ,直道变成 全1 的时候 x+1 就溢出为全 0 ,循环结束。 2014 的二进制是 0000 0000 0000 0000 0000 0111 1101 1110 ,所以结果是 23

6.有以下函数,该函数的功能是()

int fun ( char* s )
{
   char* t = s ;
   while ( * t ++ );
   return ( t - s );
}
A: 比较两个字符的大小                      B: 计算 s 所指字符串占用内存字节的个数
C: 计算 s 所指字符串的长度                D: s 所指字符串复制到字符串 t

答案解析:
正确答案: B
循环在 *t 0 时停止,同时 t++ t 最后会停在字符串结束的 '\0' 之后的一个位置, t 作为尾部指针减去头部指针就是整个字符串 占用内存的字节数,包含\0 在内;而 c 答案字符串长度不包括最后的 \0

7.关于指针下列说法正确的是【多选】( )

A: 任何指针都可以转化为 void *                         B: void * 可以转化为任何指针
C: 指针的大小为 8 个字节                                   D: 指针虽然高效、灵活但可能不安全
答案解析:
正确答案: ABD
C 选项,指针占几个字节要看平台, 64 位环境下 8 个字节, 32 位环境下 4 个字节

8.指出下列代码的缺陷【多选】( )

flfloat f [ 10 ];
// 假设这里有对 f 进行初始化的代码
for ( int i = 0 ; i < 10 ;)
{
if ( f [ ++ i ] == 0 )
break ;
}
A: for(int i = 0; i < 10;) 这一行写错了                B: f flfloat 型数据直接做相等判断有风险
C: f[++i] 应该是 f[i++]                                         D: 没有缺陷
答案解析:
正确答案: BC
一般 flfloat 型只能精确到小数后六位(即 1e-6 ), flfloat型数据的绝对值与1e-6 比较,来判断是否相等(为零)。 flfloat 的精度 误差在1e-6 double 精度误差在 1e-15 ;所以要判断一个 flfloat 型数: if(fabs(f)<1e-6) ;要判断一个 double 型数: if(fabs(f)<1e- 15);若满足,则为零。考虑 B 选项是对的。若要判断 flfloat a,b 是否相等,要看 if(fabs(a-b)<1e-6) 是否为真。 C 选项,考虑的是 数组越界问题

9.请问下列代码的输出结果有可能是哪些【多选】( )

#include <stdio.h>
typedef union
{
int a ;
struct
{
short b ;
short c ;
};
} X ;
int main ()
{
X x ;
x . a = 0x20150810 ;
printf ( "%x,%x\n" , x . b , x . c );
return 0 ;
}

A: 2015,810             B: 50810,201                C: 810,2015                 D:`20150,810  

答案解析:
正确答案: AC
对于 0x20150810
如果按照大端模式存储:从低地址到高地址: 20150810 输出从低地址到高地址: 20150810
如果按照小端模式存储:从低地址到高地址: 10081520 输出从高地址到低地址: 08102015
此数以 int 类型赋值给联合体 x.a ,而以结构成员 b c 分开访问,分别拿到低地址的 2 个字节和高地址的 2 个字节,大端下是2015和 810 ,小端下是 810 2015

10.请问下列程序的输出是多少()

#include<stdio.h>
int main ()
{
   unsignedchar i = 7 ;
   int j = 0 ;
   for (; i > 0 ; i -= 3 )
 {
    ++ j ;
 }
   printf ( "%d\n" , j );
   return 0 ;
} 

A: 2              B: 死循环               C: 173           D: 172 

答案解析:
正确答案: C
本题就是找规律,计算什么时候能遇到 0
unsigned char 8 位数据位,范围在 0-255 ,所以 -2 (11111110)时,变成 254 ;同理 -1 (11111111)时,变成 255 ;最后减 到0 时,不满足循环条件, for 停止。刚好 173 次。 7 4 1 ==> (7-1)/3+1=3 次(1-3=-2,即 254 ,继续循环) 254 251 ... 5 2 ==> 共 (254-2)/3+1=85 次(2-3=-1,即 255 ,继续循环) 255 252 ... 6 3 ==> 共 (255-5)/3+1=85 次(3-3=0,退出循环) 所以总共 173

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 


猜你喜欢

转载自blog.csdn.net/WHabc2002/article/details/132517511