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

前言:

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


1、在上下文及头文件均正常的情况下,下列代码的输出是( )(注: print 已经声明过)
int main ()
{
char str [] = "Geneius" ;
print ( str );
return 0 ;
}
print ( char * s )
{
if ( * s )
{
print ( ++ s );
printf ( "%c" , * s );
}
}

A: suiene         B: neius       C: run-time error        D: suieneG 

答案解析:
正确答案: A
代码实现了递归倒序打印字符串的功能,但是 ++s 使得 s 的值发生了变化,回不到 'G' 的位置上,故而没有打印 'G'

2. 若有定义: int a[2][3]; ,以下选项中对 a 数组元素正确引用的是( )
A: a[2][0]            B: a[2][3]           C: a[0][3]          D: a[1>2][1]
答案解析:
正确答案: D
本题主要考虑数组越界访问的情况,二维数组的行和列都是从 0 开始的,对于 a 数组来说,行下标最大是 1 ,列下标最大是 2 ,D选项中 1>2 表达式的值是 0 ,是正确的,其他选项行和列都可能存在越界, A 是行越界, B 是行和列都越界, C 是列越界。

3 、以下哪个选项可以正确描述 sizeof(double) ( )
A: 一个整型表达式      B: 一个双精度型表达式      C: 一个不合法的表达式        D: 一种函数调用

答案解析:
正确答案: A
sizeofC 语言中的一个操作符,不是函数调用,简单的说其作用就是返回一个对象或者类型所占的内存字节数,结果是无符号整数,因此可以把它看作是整型表达式。所以选择A

4.二维数组X按行顺序存储,其中每个元素占1个存储单元。若 X[4][4] 的存储地址为 Oxf8b82140 , X[9][9] 的存储地 址为 Oxf8b8221c ,X[7][7] 的存储地址为( )

A: Oxf8b821c4            B: Oxf8b821a6           C: Oxf8b82198              D: Oxf8b821c0
答案解析:
正确答案: A
假设每行有 n个元素:即X[4][4]只需要加上5就可以得到X[4][9]了,而得到的位置和X[9][9]相差5行, 那x[9][9] 元素的地址 - x[4][4] 元素的地址 = 0x21c-0x140=5n+5(21c 140 是地址末三位的十六进制 数) ,这里 n 43 ,假设 x[7][7] 的地址是 z,x[7][7] 元素的地址 - x[4][4] 元素的地址 = z-0x140 = 3n+3 z = 3n+3+140 = 3*43+3+0x140 = 0x84+0x140 = 0x1c4,看地址的尾数,选择 A

5.求函数返回值,传入 -1 ,则在 64 位机器上函数返回( )
int func ( int x )
{
int count = 0 ;
while ( x )
{
count ++ ;
x = x & ( x - 1 ); // 与运算
}
return count ;
}
A: 死循环        B: 64        C: 32        D: 16
答案解析:
正确答案: C
x=x&(x-1)这个表达式执行一次就会将x2进制中最右边的1 去掉,在 x 变成 0 之前,表达式能执行几次,就去掉几个 1 ,所以这 个代码实现了求一个有符号整数二进制补码中1 的个数的功能,我们知道 -1 的补码是全 1 ,而 int 类型 4 个字节 32 位,选 C

6.读代码选结果( )

int count = 0 ;
int x = - 1 ;
while ( x )
{
count ++ ;
x = x >> 1 ;
}
printf ( "%d" , count );
A: 1           B: 2           C: 32           D: 死循环,没结果
知识点补充:
1. 左移 << : 最左侧位不要了 , 最右侧补 0。
2. 右移 >> : 最右侧位不要了 , 最左侧补符号位 ( 正数补 0, 负数补1)。
3. 无符号右移 >>>: 最右侧位不要了 , 最左侧补 0.(c语言没有,java有)
答案解析:
正确答案: D
此题一个关键,有符号数右移运算高位是补符号位的,负数的符号位是 1 ,所以 x 永远不会变为 0 ,是个死循环

7.下述赋值语句错误的是( )

A: a = (b = (c = 2 , d = 3))       B: i++        C: a/b = 2          D: a = a < a + 1
答案解析:
正确答案: C
C 选项中 a/b 是表达式,表达式计算的结果是一个值不能做左值

8.以下程序运行后的输出结果是()

int main ()
{
int a = 1 , b = 2 , m = 0 , n = 0 , k ;
k = ( n = b < a ) && ( m = a );
printf ( "%d,%d\n" , k , m );
return 0 ;
}
A: 0,0              B: 0,1            C: 1,0               D: 1,1
答案解析:
正确答案: A
k=(n=b<a)&&(m=a); 这部分的执行顺序如下:先执行 n=b<a 部分,其中,关系运算符优先级高于赋值运算符,所以先算 b<a ,得到0 n=0 赋值运算的结果将作为括号内表达式的结果,即 (n=b<a)&&(m=a) 转换成 (0)&&(m=a)&&运算前表达式为假,则后面的括号(m=a)不运算,m值还是0,最后,&&的结果是0,即k=0

9.下面函数的输出结果是( )

int main ()
{
int k = 1 ^ ( 1 << 31 >> 31 );
printf ( "%d\n" , k );
}

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

答案解析:
正确答案: C
(1<<31); 左移 31 位,并在右侧填充 0 ,得到 0x80000000 ,即符号位为 1 ,其他为 0 ,即 -2147483648 int k =1^(1<<31>>31);注意,这里在右移的时候,符号位保持为 1 ,右移后填充 1 ,结果为 0xFFFFFFFF ,即 -1 ,0x00000001^0xFFFFFFFF,即 0xFFFFFFFE(-2)

10.如下代码的输出结果是( )

#include <stdio.h>
int main ()
{
int i = 1 ;
sizeof ( i ++ );
printf ( "%d\n" , i );
return 0 ;
}

A: 1               B:               4 C: 2             D: 8  

答案解析:
正确答案: A
一般表达式的运算是在运行时执行的,而 sizeof 是一个编译阶段就执行的运算符,在其内的任何运算都不执行,只推测出其中表达式结果的类型求其大小,故前后i 的值不变。

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

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

 

猜你喜欢

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