声明:

  1. 这家公司偏人工智能
  2. 题目仅代表个人观点,若有错误欢迎指出。

一、单选

  1. 瀑布模型把软件生命周期划分为8个主要阶段,其中(C)阶段定义的规划将成为软件测试中的系统测试阶段的目标。
    A.问题的定义
    B.可行性研究
    C.软件需求分析
    D.系统总体设计

    这题一开始我选的B,记住答案就行了,太偏了
  2. 有以下程序,执行后的结果是(B

    void main() {
     char *s[] = {"one", "two", "three"}, *p;
     p = s[1];
     printf("%c, %s\n", *(p + 1), s[0]);
    }

    A. n,two
    B. w,one
    C. t,one
    D. o,two

    • 这题我写错了,错因在不清楚字符指针数组。
    • 这里s是一个字符指针数组,数组中存放的是一个个字符指针,char p = "abc"表示将字符串常量abc的首地址赋值给p,所以p=s[1]即为char p = "two",接下来就柳暗花明了。

二、填空

  1. 在32位系统中,写代码向内存0x30008000地址写入一个整形值0x100

    • 属实不会,上网查了下“如何往指定内存写数据”但是我测试的时候发现什么都输出不了,望友友们解答下~~
    • 参考:int *p = (int )0x30008000;*p = 0x100;或(int *)0x30008000 = 0x100;

三、简答

  1. delete和delete[]的区别:

    • delete:回收用 new 分配的单个对象的内存空间
    • delete[]:回收用 new[] 分配的一组对象的内存空间
  2. new、delete、malloc、free之间的关系:

    • 都可以用来在堆上分配和回收空间。new/delete是操作符,malloc/free是库函数。
    • 执行new实际上执行两个过程:a.分配未初始化的内存空间(malloc作用)b.使用对象的构造函数对空间进行初始化;
      执行delete也有两个过程:a.使用析构函数对对象进行析构 b.回收内存空间(free作用)
  3. 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?

    C语言中为宏定义,C++中为内联函数
  4. 说明静态绑定和动态绑定的特性和用法:

    • 静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期;(静态类型:对象在声明时采用的类型,在编译期既已确定;)
    • 动态绑定:绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期;(动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的;)
    • 区别:静态绑定发生在编译期,动态绑定发生在运行期;对象的动态类型可以更改,但是静态类型无法更改;要想实现动态,必须使用动态绑定;在继承体系中只有虚函数使用的是动态绑定,其他的全部是静态绑定;

四、编程

  1. 编程用二分法实现整数快速查找:

    int BinarySearch(vector<int> &num, int target) {
     int left = 0, right = num.size() - 1;
     while(left <= right) {
         int mid = left + right / 2;
         if(mid == target)
             return mid
         else if(mid > target)
             left = mid + 1;
         else 
             right = mid - 1;
     }
     return -1; //查找失败
    }
  2. 反转数字,如x=123则返回321,若x=-123则返回-321.编程实现,C语言或C++都可:
    [源引]()

    本题注意事项:

    • 只反转数字部分,符号位部分不反转
    • 反转后整数num超过 32 位的有符号整数的范围\([-2^{31},2^{31}-1]\),返回 0
    • 假设本题不允许存储 64 位整数(有符号或无符号,即C++不能使用long long ,Java不能使用long等)
    //本题关键点在于如何判断溢出
    //法一:最简单法判断溢出-每次计算新的结果时,再用逆运算判断与上一次循环的结果是否相同,不同就溢出
    int reverse(int x) {
         int res = 0;
         while(x != 0) {
             //最后一位
             int tail = x % 10;
             int newRes = res * 10 + tail;
             if ((newRes - tail) / 10 != res)
                 return 0;
             res = newRes;
             x /= 10;
         }
         return res;
    }
    //法二:若题目没限制不可用long long,则用long long类型存储结果,如果结果大于0x7fffffff或者小于0x80000000就溢出

扩展:

1.long int简写long;long long int简写long long。了解下
2.在计算机中,数值一律用补码来表示和存储,原因在于,使用补码,可以将符号位和数值域统一处理。同时,加法和减法也可以统一处理。

  • 正数的原码、反码、补码都是相同的.
  • 求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。即负数的反码是对正数逐位取反,符号位保持为1。负数的反码等于原码符号位不变,其余各位逐位取反,补码等于反码加1。
  • 0的补码,数0的补码表示是唯一的。
  • 32位系统中为啥int范围是\([-2^{31},2^{31}-1]\)解答

Kribe_Jackson
1 声望0 粉丝