C++每日十题10.19

1.以下对二维数组 a 的正确说明是()。
正确答案: C 你的答案: C (正确)
A int a[3][]
B float a(3,4)
C double a[1][4]
D float a(3)(4)

2.基类中的成员在派生类中都是可以直接访问的.说法是否正确?

正确答案: B 你的答案: B (正确)
A正确
B错误

3.函数调用不可以()。

正确答案: D 你的答案: D (正确)
A 出现在执行语句中
B 出现在表达式中
C 作为一个函数的实参
D 作为一个函数的形参

4.以下选项中,不能作为合法常量的是( )。

正确答案: B 你的答案: B (正确)
A 1.234e04
B 1.234e0.4
C 1.234e+4
D 1.234e0

e后面必须是整数

5.以下描述中正确的是()。

正确答案: C 你的答案: B (错误)
A 由于do-while循环中循环体语句只能是一条可执行语句,所以循环体内不能使用复合语句
B do-while循环由do开始,用while结束,在while(表达式)后面不能写分号
C 在do-while循环体中,一定要有能使while后面表达式的值变为零(“假”)的操作
D do-while循环中,根据情况可以省略while

B :do while while后得加;
C :感觉有点问题
int count=0; do{ count++; if(count>=100)break; }while(true);
用break跳出时 while的表达式为true就行。

6.关于纯虚函数,下列表述正确的是?( )
正确答案: B 你的答案: A (错误)
A 派生类必须实现基类的纯虚函数
B 纯虚函数的声明总是以“=0”结束
C 纯虚函数是给出实现版本(即无函数体定义)的虚函数
D 含有纯虚函数的类一定是派生类

A:派生类可以不实现纯虚函数,只不过它就和基类一样不能实例化了。
B:纯虚函数以‘=0’结束;

7.请问下面的程序一共输出多少个“-”?为什么?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
 
int main(void) {
   int i;
   for (i=0; i<2; i++) {
      fork();
      printf("-\n");
   }
   return 0;
}

详细解析(含本程序图解&&(printf(“- \n”)与printf("-")的区别))

8.以下代码输出什么?

int a =1,b =32 ;
printf("%d,%d",a<<b,1<<32);

正确答案: D 你的答案: 空 (错误)
A 1,1
B 1,0
C 0,0
D 取决于编译器

CONTAINER::iterator iter , tempIt;
for (iter = cont.begin() ; iter != cont.end() ; )      
{
    tempIt = iter;
    ++iter;
    cont.erase(tempIt);
      
}

假设cont是一个CONTAINER的示例,里面包含数个元素,那么当CONTAINER为: 1、vector 2、list 3、map 4、deque 会导致上面的代码片段崩溃的CONTAINER类型是
1,4

解析:首先看看各个容器的erase(pos)实现吧:

  1. vector,erase(pos),直接把pos+1到finish的数据拷贝到以pos为起点的区间上,也就是vector的长度会逐渐变短,同时iter会逐渐往后移动,直到iter == cont.end(),由于容器中end()返回的迭代器是最后一个元素的下一个(这个地方没有任何值),现在考虑这个状态前一个状态,此时要删除的点是iter, tempIt = iter, ++iter会指向此时的end(),但是执行erase(tempIt)之后,end()向前移动了!!!问题来了,此时iter空了!!!不崩溃才怪。

  2. list,erase(pos),干的事情很简单,删除自己,前后的节点连接起来就完了,所以iter自增的过程不会指空,不会崩溃喽。

  3. map,erase(pos),干的事情太复杂,但是我们需要知道的信息其实很少。该容器底层实现是RBTree,删除操作分了很多种情形来讨论的,目的是为了维持红黑树性质。但是我们需要知道的就是每个节点类似于list节点,都是单独分配的空间,所以删除一个节点并不会对其他迭代器产生影响,对应到题目中,不会崩溃喽。

  4. deque,erase(pos),与vector的erase(pos)有些类似,基于结构的不同导致中间有些步骤不太一致。先说说deque的结构(这个结构本身比较复杂,拣重要说吧,具体看STL源码),它是一个双向开口的连续线性空间,实质是分段连续的,由中控器map维持其整体连续的假象。其实题中只要知道它是双向开口的就够了(可以在头部或尾部增加、删除)。在题中有erase(pos),deque是这样处理的:如果pos之前的元素个数比较少,那么把start到pos-1的数据移到起始地址为start+1的区间内;否则把pos后面的数据移到起始地址为pos的区间内。在题中iter一直往后移动,总会出现后面数据比前面少的时候,这时候问题就和1一样了,必须崩溃!

10.以下有关C语言的说法中,错误的是________。
正确答案: D 你的答案: D (正确)
A 内存泄露一般是指程序申请了一块内存,使用完后,没有及时将这块内存释放,从而导致程序占用大量内存。
B 可以通过malloc(size_t)函数调用申请超过该机器物理内存大小的内存块。
C 无法通过内存释放函数free(void*)直接将某块已经使用完的物理内存直接还给操作系统。
D 可以通过内存分配函数malloc(size_t)直接申请物理内存。

malloc不能直接申请物理内存,它申请的是虚拟内存

猜你喜欢

转载自blog.csdn.net/qq_41002048/article/details/83183735