前言:
编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,每篇大约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:
一种函数调用
答案解析:
正确答案: Asizeof是C 语言中的一个操作符,不是函数调用,简单的说其作用就是返回一个对象或者类型所占的内存字节数,结果是无符号整数,因此可以把它看作是整型表达式。所以选择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
答案解析:
正确答案: Cx=x&(x-1)这个表达式执行一次就会将x的2进制中最右边的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
答案解析:
正确答案: CC 选项中 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
答案解析:
正确答案: Ak=(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 的值不变。
以上为我个人的小分享,如有问题,欢迎讨论!!!
都看到这了,不如关注一下,给个免费的赞