牛客刷题
- 有以下程序,程序运行后的输出结果是©
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int m=0123, n = 123;
printf("%o %o\n", m, n);
return 0;
}
A 0123 0173
B 0123 173
C 123 173
D 173 173
题中格式化输出printf中使用了%o也就是要求进行8进制打印,8进制数字表示的形式的特征为数字以0开头,也就是说m是8进制数字而n是十进制数字。因此这里的m以8进制输出为123,而n需要进行进制转换将10进制数字转换为8进制,转换结果为173,因此选择C
- 以下哪个选项一定可以将flag的第二个bit置0(A)
A flag&=~2
B flag|=2
C flag^=2
D flag>>=2
题中的4个选项都是进行位运算。
按位或:只要有一个比特位为1则为1
按位与:只有两个比特位都为1才为1,否则为0
按位异或:两个比特位数字不同即一个为1一个为0才为1,否则都为0.
A:flag&=~2 这里先将2取反则1111 1101再将其与上flag,因此第二个比特位被置0
B选项使用flag或上2,只能将第二个比特位置为1,不能置0。
C选项将flag与2进行异或运算,异或置为0只有当flag的第二个比特位也为1时,才会是0,并且还会改变其他位的值。
D右移运算符将flag比特位右移两位,并没有置0的功能,因此选A
- 请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变。(B)
A const int const *x = &y;
B int * const x = &y;
C const int *x = &y;
D int const *x = &y;
E const int * const x = &y;
题中要求指针指向的内存地址不能改变,内存的值可以改变,这就是要求该指针为指针常量。根据指针常量的特点,const修饰符应该在*的右边,因此选B
- 以下C语言指令:
int a[5] = {1,3,5,7,9};
int *p = (int *)(&a+1);
printf(“%d,%d”,*(a+1),*(p-1));
运行结果是什么?(C)
A 2,1
B 3,1
C 3,9
D 运行时崩溃
题中p指针&a+1相当于向后偏移整个a数组的大小,也就是p指向a数组最后一个元素后一个地址。printf打印中*(a+1)相当于a向后偏移一个元素的大小,也就是指向3,p-1则是向前移动一个整型,也就是指向9,因此打印结果为3和9,选择C
- 二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为(A)。
A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0
题中二维数组的行和列都是未知。这里可以假设有m行n列,假设起始位置为start,那么
x[4][4]的地址为start+4n+4,结果为0xf8b82140
x[9][9]的地址为start+9n+9,结果为0xf8b8221c
那么这里可以算出start的值和n的值,n的值为43,这里可以用x[4][4]开始计算,最后的结果为0xf8b821c4,因此选A
- 根据下面递归函数:调用函数Fun(2),返回值是多少(D)
int Fun(int n)
{
if(n==5)
return 2;
else
return 2*Fun(n+1);
}
A 2
B 4
C 8
D 16
题中观察递归函数语句,这里的递归出口是当n等于5的时候,因此输入2的时候,需要经过3次递归,也就是2的4次方,最终结果为16,因此选D
- 以下程序的输出结果是:(A)
#include <iostream>
using namespace std;
void func(char **m){
++m;
cout<<*m<<endl;
}
int main(){
static char *a[]={"morning", "afternoon", "evening"};
char **p;
p=a;
func(p);
return 0;
}
A afternoon
B 字符o的起始地址
C 字符o
D 字符a的起始地址
数组名表示数组首元素地址,只有在&和sizeof之后才表示数组本身。a中存放的是字符串本身就是char*类型,因此a是一个存放字符串的二维数组,p指向首元素地址因此p也是一个二级指针。函数中对指针进行++,也就是向后偏移一个元素,元素为字符串,因此p++后指向第二个字符串也就是afternoon,因此选A
- 求函数返回值,输入x=9999(A)
int func(int x){
int count=0;
while (x)
{
count++;
x=x&(x-1);//与运算
}
return count;
}
A 8
B 9
C 10
D 12
题中每次循环将x和x-1进行按位与,然后再赋值给x,这个算法的功能实际上就是计算x这个数字中有多少比特位为1,因此这里9999转换为2进制后为0010 0111 0000 1111,也就是有8个1,因此选A
- 下列程序执行后,输出的结果为(B)
#include<stdio.h>
int cnt=0;
int fib(int n)
{
cnt++;
if(n==0)
return 1;
else if(n==1)
return 2;
else
return fib(n-1)+fib(n-2);
}
void main()
{
fib(8);
printf("%d",cnt);
}
A 41
B 67
C 109
D 177
该题目中的fib实际上是一个斐波那契数列,使用cnt来进行计算总的递归次数。f0需要递归1次,f1需要递归1次,f2需要递归f1+f2再加上自身也就是3次,f3=f2+f1+1也就是5次,以此类推f8的时候需要递归67次,因此选B
- 在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是:©
struct A
{
int a;
short b;
int c;
char d;
};
struct B
{
int a;
short b;
char c;
int d;
};
A 16,16
B 13,12
C 16,12
D 11,16
这题目是结构体大小计算问题,也就是考察结构体对齐的问题。根据结构体对齐规则:
保证每个成员都在一个对齐的地址上
结构体整体进行对齐,不对齐需要进行补字节
A的大小为 4 + 2 + 2 + 4+1 + 3也就是16,
B的大小为4 + 2 + 1 + 4 + 1也就是12,因此选C