码迷,mamicode.com
首页 > 其他好文 > 详细

CSDN看的一些 C艹笔试题

时间:2016-04-26 20:55:04      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

整理自:http://blog.csdn.net/djb100316878/article/details/39720055,其有很多错误。。。

1:

32 位机上根据下面的代码,问哪些说法是正确的? ( )
signed char a = 0xe0;
unsigned int b = a;
unsigned char c = a;
A. a>0 && c>0 为真
B. a == c 为真
C. b 的十六进制表示是:0xffffffe0
D. 上面都不对

 

解释:0xe0  十进制为 224  二进制为11100000

char a 为有符号类型,第一位是符号位,0代表正数,1代表负数,所以char a = -32;

而 char c 为 无符号类型,所以a与c肯定不相等, 所以A、B错误;

再看C  a为char类型占一个字节,b是int类型,占4个字节,把一个字节赋给4个字节

缺的应该补符号位,a为 1110000  所以b就是  1111 1111 1111 1111 1111 1111 1110 0000 也就是0xffffffe0;所以选C;


2:

下面哪些选项能编译通过? ( )
int i;
char a[10];
string f();
string g(string & str);
A. if(!!i){f();}
B. g(f());
C. a=a+1;

D. g("abc");

解释:

首先排除C,数组名不能这样使用,a不能作为左值,因为a是一个常量指针;

再看D,"abc"是 const char * 类型,类型不匹配,所以D错;

最关键的看B选项,string f()返回的是一个临时变量的对象,而string g(string& str)的参数是非const引用,C++中有个语法规则,非const引用不能用临时变量初始化,C++中这样使用是为了限制潜在的错误。至于原因,网上很多说法没有一个统一的,但是C++中这样明确规定的,我自己感觉g(f());f()返回的这个临时对象,如果传给非const引用,有可能被修改,所以不安全,可能引发很多错误。

再看A其实很简单,是对的

 

3. int a[10]; 问下面哪些不可以表示 a[1] 的地址? ( )
A. a+sizeof(int)
B. &a[0]+1
C. (int*)&a+1
D. (int*)((char*)&a+sizeof(int))

 

解释:

Type* a;

a+ n 的计算规则

(unsigned int)a + n*sizeof(int)

所以 &a[1]的地址为: (unsigned int)a + 1* sizeof(int);

首先看A,带入公式为: (unsigned int)a + 4*sizeof(int);错误;

再看B,&a[0]就是第一个元素的地址, 带入公式就是 (unsigned int)a + 1* sizeof(int);正确

再看C,首先这里&a前面为什么加int*,因为&a是数组的首地址  它的类型是 int(*)[10];而a是数组首元素的地址,它的类型为int(*); 所以C也正确

再看D  先把&a转化为char* 类型  所以这里相当于: (unsigned int)a + sizeof(int)*sizeof(char);也是正确的;

 

5:

下面哪些函数调用必须进入内核才能完成? ( )
A. fopen
B. exit
C. memcpy
D. strlen

 

解释: 

选AB,fopen打开一个文件,要调用线程内核,exit操作系统才有这个退出的权限,所以也调用内核

CD只是简单的字符串处理,不需要进入内核;

 

6:

 死锁发生的必要条件? ( )
A. 互斥条件
B. 请求和保持
C. 不可剥夺
D. 循环等待

 

解释:

选ABCD 不解释

 

7:

有两个线程,最初 n=0,一个线程执行 n++; n++; 另一个执行 n+=2; 问,最后可能的 n 值? ( )
A. 1
B. 2
C. 3
D. 4

解释:n++ 与 n+=2  在汇编中有三个过程 第一:读物n的值;第二:n的值加1或者加2;第三:把n的值写入内存

这三个过程可能被打断,结果就是 BCD都有可能。


8. 下面哪些说法正确? ( )
A. 数组和链表都可以随机访问
B. 数组的插入和删除可以达到 O(1)
C. 哈希表无法法进行范围检查
D. 二叉树无法进行线性访问


解释:

 A数组可以随机访问,链表不可以

B数组插入要移动很多,不是O(1);

D二叉树可以先线性化,再进行线性访问,(这个我也不懂,数据结构学的不好)【估计是先遍历出成数组,便成了线性访问?】

C正确

 

9. 基于比较的排序的时间复杂度下限是多少? ( )
A. O(n)
B. O(n^2)
C. O(nlogn)
D. O(logn)

解释: 选C 死记硬背

 

10. 对于下列程序,在一个 big endian 的 32 位的计算机上,b 的结果是? ( )
unsigned int a = 0x1234;
char b = *((char*)&a);
A. 0x12
B. 0x34
C. 0x00
D. 程序崩溃

解释:

大端模式:高位存在于低地址。小端模式是高位存在于高地址。

unsigne int a = 0x1234

0x00 0x00 0x12 0x34

低----------------------高

b取低地址第一个地址,所以是 0x00;

 

11. 编写函数求两个整数 a 和 b 之间的较大值。要求不能使用 if, while, switch, for, ?: 以及任何的比较语句。

int max(int a , int b)  
{  
    int d = a - b;  
    int flag = (unsigned int )d >> 31; //把符号位移到最低位,欲让flag为0或1,所以不能补符号位!所以为 unsigned int   
    int array[] = {a,b};  
    return array[flag];  
}  

1. 考虑函数原型 void hello(int a, int b=7, char* pszC="*"),下面的函数调用中属于不合法调用的是( )
A. hello(5)
B. hello(5, 8)
C. hello(6, "#")
D. hello(0, 0, "#")

 

解释:考C++中参数的默认变量   选C

 

2. 一个有 800 个结点的完全二叉树,问有多少个叶子结点? ( )
A. 100
B. 200
C. 400
D. 无法确定

 

解释:先求完全二叉树的深度 h = log2(800) + 1= 9 + 1 = 10;

那么前面9层的节点数为 2的9次幂 - 1 为 511;

最后一层节点数为 800 - 511 = 289;

289 = 288 + 1 ; 288 所以第九层当中有144个节点有子节点;

完全二叉树第9行也有叶子节点;

所以第九层有 144+1 = 145个节点不是叶子节点;

256- 144 -1 = 111个叶子节点;

所以有111+289 = 400个叶子节点;


完全二叉树特点:

叶子结点可能在最大的两层上出现,对任意结点,若其右分支下的子孙最大层次为L,则其左分支下的子孙的最大层次必为L 或 L+1;

如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。
 
可以根据公式进行推导,假设n0是度为0的结点总数(即叶子结点数),n1是度为1的结点总数,n2是度为2的结点总数,由二叉树的性质可知:n0=n2+1,则n= n0+n1+n2(其中n为完全二叉树的结点总数),由上述公式把n2消去得:n= 2n0+n1-1,由于完全二叉树中度为1的结点数只有两种可能0或1,由此得到n0=(n+1)/2或n0=n/2。
总结起来,就是 n0=[n/2],其中[]表示上取整。可根据完全二叉树的结点总数计算出叶子结点数。

采用公式 800/2 = 400,选C。

 

4. 排序算法的稳定是指,关键码相同的记录排序前后相对位置不发生改变,下面哪种排序算法是不稳定的( )
A. 插入排序
B. 冒泡排序
C. 快速排序
D. 归并排序

 

解释:  不稳定的:快速排序 希尔排序 堆排序 选择排序

 

5. 如下关于进程的描述不正确的是( )
A. 进程在退出时会自动关闭自己打开的所有文件
B. 进程在退出时会自动关闭自己打开的网络链接
C. 进程在退出时会自动销毁自己创建的所有线程
D. 进程在退出时会自动销毁自己打开的共享内存

 

解释:共享内存既然是共享的,则可能被几个进程共同占有,一个进程结束,如果销毁了这段共享的内存那么其他进程就会招到毁灭;选D

 

6. 在一个 cpp 文件里面,定义了一个 static 类型的全局变量,下面一个正确的描述是( )
A. 只能在该 cpp 所在的编译模块中使用该变量
B. 该变量的值是不可改变的
C. 该变量不能在类的成员函数中引用
D. 该变量只能是基本类型(如 int, char)不能是 C++类型

 

解释:A正确,static具有限制作用域的作用,防止被别的文件引用!D,static可以是类类型;BC明显错误;

 

7. 下面有关重载函数的说法中正确的是( )
A. 重载函数必须具有不同的返回值类型
B. 重载函数形参个数必须不同
C. 重载函数必须有不同的形参列表
D. 重载函数名可以不同

 

解释:C很简单


9. 下面哪种情况下,B 不能隐式转换为 A ? ( )
A. class B:public A{ };
B. class A:public B{ };
C. class B{ operator A(); };
D. class A{ A(const B&); };

 

解释:根据赋值兼容性原则,子类可以转换为父类赋值给父类对象;但是反过来不正确,所以B错误

C中为 类型转换函数,D中为 采用构造函数的方式转换,C和D都可以转换成功!

 

10. 分析下面程序的运行结果: ( )
#include<iostream.h>
class CBase
{
public:
CBase(){ cout<<"constructing CBase class"<<endl; }
~CBase(){ cout<<"destructing CBase class"<<endl; }
};
class CSub : public CBase
{
public:
CSub(){cout<<"constructing CSub class"<<endl;}
~CSub(){cout<<"destructing CSub class"<<endl;}
};
void main()
{
CSub obj;
}
A. constructing CSub class
constructing CBase class
destructing CSub class
destructing CBase class
B. constructing CBase class
constructing CSub class
destructing CBase class
destructing CSub class
C. constructing CBase class
constructing CSub class
destructing CSub class
destructing CBase class
D. constructing CSub class
constructing CBase class
destructing CBase class
destructing CSub class

 

解释:很简单  选C 


11. 两个字符串 char* a, char* b,输出 b 在 a 中的位置次序。
void output_postion(const char* a, const char* b);
如:a = "abdbcc" b = "abc"
b 在 a 中的位置次序为
014
015
034
035

 

解释:

#include <iostream>  
#include <string>  
#include <list>  
  
using namespace std;   
  
void findCore(string a, int aIndex, string b, int bIndex, list<int>& ans)  
{  
    if(bIndex == b.length())  
    {  
        for(list<int>::iterator iter = ans.begin(); iter != ans.end(); iter++)  
        {  
            cout<<*iter;  
        }  
        cout<<endl;  
    }  
    else  
    {  
        for(int i = aIndex; i < a.length(); i++)  
        {  
            if(a[i] == b[bIndex])  
            {  
                ans.push_back(i);//如果相等,把序号加入到链表l   
                findCore(a, i + 1 , b , bIndex + 1 , ans);//递归   
                ans.pop_back();//回溯   
            }  
        }  
    }  
}  
  
void find(const char* a, const char* b)  
{  
    string as = a;  
    string bs = b;  
    list<int> ans;//用来保存 相等的序号   
    findCore(as , 0 , bs , 0 , ans);  
}  
  
int main(int argc, char** argv) {  
      
    char* a = "abdbcc";  
    char* b = "abc";  
    find(a, b);  
      
    return 0;  
}  


CSDN看的一些 C艹笔试题

标签:

原文地址:http://blog.csdn.net/dr_unknown/article/details/51239884

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!