C++面试题1

第1课 - 腾讯笔试题精选一

  1. 32位机上根据下面的代码,问哪些说法是正确的()

signed char a = 0xe0;

unsigned int b = a;

unsigned char c = a;

  1. a>0 && c>0 为真
  2. a == c 为真
  3. b的十六进制表示为:0xffffffe0
  4. 上面都不对

解析:0xe0的十六进制表示为10进制为224,二进制表示为11100000,开头是1,在有符号数里面开头是1表示负数,a的实际值是-32,c的实际值的224;用a1去初始化无符号整型,将一个符号位的数赋值4个符号位的数,需要补符号位,a被解释为-32,符号位是1,将b的空白位置都补充为1,b变成0xffffffe0。

正确选C

考点:数据类型,符号位,补符号位

  1. 下面哪些选项能编译通过()

int i;

char a[10];

string f();

string g(string & str);

  1. If(!!i){f();}
  2. g(f());
  3. a = a+1;
  4. g(“abc”);

解析:数组名可以进行加法运算,但是不能进行赋值运算的,C选项错误;“abc”是const char*是字符指针类型,这种类型转换不成string引用,D选项错误;只有const引用才能被临时变量或者临时对象所初始化,B选项不正确;

正确选A

考点:C++中的引用,标准库

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;

【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名。

  1. int a[10];问下面哪些不可以表示a[1]的地址()
  2. a+sizeof(int)
  3. &a[0]+1
  4. (int*)&a+1
  5. (int*)((char*)&a+sizeof(int))

解析:指针运算的规律是:type* a; a + n; (unsigned int)a + n * sizeof(type)

&a[1]表示为(unsigned int)a + 4;A选项中表示为:(unsigned int)a + 4 * sizeof(int)表示的不是a[1]的地址;B选项表示为:(unsigned int)( &a[0]) + 1 * sizeof(int),首字母的地址与数组名的地址是一样的,正确。C选项中,&a和a的值是一样的,都是数组的地址,但是他们的类型不一样,&a的类型是int(*)[10], a的类型是int*,C正确;D选项中(char*)&a+sizeof(int)表示为(unsigned int)a+4*sizeof

(char),正确。

正确选A

考点:数组地址运算

  1. 问下面的数据存放在哪些存储区()

int main()

{

       char *p = “hello,world”;

       return 0;

}

  1. 代码段
  2. 常量区

解析:函数体存放在代码段,代码中的数据有“hello,world”,存放在常量区,char *p存放在栈。

正确选BC

考点:编译语言,C语言

  1. 下面哪些函数调用必须进入内核才能完成()
  2. fopen
  3. exit
  4. memcpy
  5. strlen

解析:这四个函数都是C语言开发使用的函数,fopen是打开设备文件的,同时会出发驱动程序,驱动程序在内核;exit结束当前的进程,只有内核才能完成。Memcpy、strlen在用户空间就可以完成

正确选AB

考点:C语言,操作系统,应用经验

  1. 死锁发生的必要条件()
  2. 互斥条件
  3. 请求和保持
  4. 不可剥夺
  5. 循环等待

解析:互斥条件指的是一个资源一次只能被一个任务所占有,任务往往指的是一个线程,另一个任务不能使用;另一个程序要使用就是请求,使用的进程在保持,同时使用的进程不可波段,需要循环等待。

正确选ABCD

考点:操作系统,线程

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

解析:第一个执行完执行第二个,n的值为4;n++在汇编语言中分为三条语句,分别是(1)取n值(2)加1(3)写n值到内存,当线程1执行完一次n++,第二个执行步骤(2)时,执行线程2,线程2将3写为内存,之后线程1继续执行,将2存在内存,将3冲掉,此时n的值是2;线程1执行完一次n++,执行线程2,执行到(2)时,执行线程1,线程1结束执行线程2,此时n的值是3;这两个线程都加2,两个线程无论怎么交替都不会是1。

正确选BCD

考点:多线程编程,编程原理

8.下面哪些说法是正确的()

A. 数组和链表都可以随机访问

B. 数组的插入和删除可以达到O(1)

C. 哈希表无法进行范围检查

D. 二叉树无法进行线性访问

解析:只有数据才可以随机访问,链表只能顺序访问;数组元素的删除,需要将临近的元素前移,复杂度大于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);

  1. 0x12
  2. 0x34
  3. 0x00
  4. 程序崩溃

解析:大端模式是数据的高位放在低地址里面,小端模式是数据的高位放在高地址里面。0x1234在大端模式中的存放方式是:00 00 12 34,在小端模式中的存放方式是34 12 00 00。大端迷失中取的是第一个字节00。

正确选C

考点:网络,字节序

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

解析:

方法一:使用符号位的用法进行,返回较小的值。

#include <cstdlib>

#include <iostream>

#include <string>

using namespace std;

int min(int a, int b)

{

    int d = a - b;

    int flag = ((unsigned int)d) >> 31;//将原本32位的开头的符号移到开头

    int array[] = {b, a};

    //若a大于b,符号位是0,意味b较小

    return array[flag];

}

int main(int argc, char *argv[])

{

    cout<< min(1, 2) <<endl;

    cout<< min(2, 1) <<endl;

    cout<< min(2, 10000)<<endl;

    cout << "Press the enter key to continue ...";

    cin.get();

    return EXIT_SUCCESS;

}

方法二:数学运算

int min(int a, int b)

{

    int d = abs(a-b);

    return (a+b-d)/2;

}

       但是由于不知道abs函数中是否有用题目中的语句,所以解法二中的算法不完善。

原文地址:https://www.cnblogs.com/free-1122/p/11341934.html