【C++】 错题整理(一)

C++考试试题 04-27 成绩报告

单选题:

1.A* pa = new A[10];// 动态申请10个的空间 delete pa;
则类A的析构函数和构造函数分别执行了几次( )
[知识点遗忘]

A.10, 1
B.10, 10
C.程序崩溃
D.程序可能崩溃

我的回答:B(错误)
正确答案:C

● new T[N]的原理

  1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请。
  2. 在申请的空间上执行N次构造函数。

● delete的原理

  1. 在空间上执行析构函数,完成对象中资源的清理工作。
  2. 调用operator delete函数释放对象的空间。

● delete[]的原理

  1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。
  2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间。
    因此,题目中类A在申请自定义类型的空间时,new调用了十次构造函数,delete调用一次析构函数,运行时会导致程序崩溃。这里应该改为 delete [] pa。

2.int* p1 = (int*)malloc(sizeof(int)); int* p2 = p1;
以下说法正确的是( )
[知识点混淆]

A.p1指向的空间在堆上,p2指向的空间在栈上
B.p1指向的空间在栈上,p2指向的空间在堆上
C.p1指向的空间在堆上,p2指向的空间在堆上
D.p1指向的空间在栈上,p2指向的空间在栈上

我的回答:B(错误)
正确答案:C

● 堆栈空间分配区别:
  栈 :由操作系统自动分配释放 ,存放函数的参数值局部变量的值等。其操作方式类似于数据结构中的栈;
  堆 : 就是那些由new分配的内存段,一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

3.对于以下代码,下面说法正确的是( ) [新知识点]

class A
{
public:
void Function()
{
cout<<"I can run crocrectly"<<endl;
}
};
A* pa = NULL;
pa->Function();

A.编译失败
B.编译成功,在调用函数时崩溃
C.编译成功,函数在运行时崩溃
D.输出I can run correctly

我的回答:B(错误)
正确答案:D

● 此时,虽然this指针实参为NULL,但是fun函数根本没有用到this指针。空指针可以调用函数,只要不在成员函数里面显式/隐式的使用this 就行。这是因为C++里this实质是函数的最后一个参数,并没什么特别的。
但是,如果在成员函数中使用的成员变量,就不可避免要使用到this指针,若是这样,就不可避免的出现崩溃了。
综上所述:空指针仍然能调用成员函数,如成员函数为virtual(静态成员函数)的话,则一开始就会崩溃,不会调用进去。

4.给出下列程序的输出结果( ) [知识点混淆]

char* p1 = "prety-girl";
char p2[] = "prety-girl";
printf("%d %d %d %d", sizeof(p1), strlen(p1), sizeof(p2),strlen(p2));

A.4 10 4 10
B.4 10 10 10
C.4 11 10 10
D.4 10 11 10

我的回答:C(错误)
正确答案:D

strlen与sizeof的区别:
strlen:是C标准库中的字符串函数,用于统计字符的个数,不包括字符串结束符。
sizeof:是c语言中的运算符,确切的说是一个编译时运算符,用于统计类型或者变量所占的内存字节数,不是实际长度。

char* p1 = "prety-girl";
//sizeof(p1)值为4,因为p1是一个char类型的指针,占四个字节;
//strlen(p1)的值为10,因为"prety-girl"这个字符串有10个字符。

char p2[] = "prety-girl";
//sizeof(p2)值为11,因为p2中加上字符串结束符,共有11个char型的变量,每个char型占一个字节;
//strlen(p2)的值为10,计算的是字符串中的字符个数。

printf("%d %d %d %d", sizeof(p1), strlen(p1), sizeof(p2),strlen(p2));

5.以下程序的功能是( ) [知识点遗忘]

include<stdio.h>
int main(void)
{
FILE *fp;
long int n;
fp = fopen("wj.txt","rb");//以只读的方式打开二进制文件“wj.txt”
fseek(fp , 0 , SEEK_END);//定义指针到文件末尾
n = ftell(fp);//读取文件的长度
fclose(fp);
printf("%ld",n);
}

A.计算文件wj.txt内容的字节数
B.计算文件wj.txt的终止地址
C.计算文件wj.txt的起始地址
D.将文件指针定位到文件末尾

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

● fopen:函数原型:FILE * fopen(const char *path,cost char *mode)
作用:打开一个文件,返回指向该文件的指针
参数说明:第一个参数为要打开文件的文件路径及文件名,第二个参数表示对文件的打开方式。
注意在fopen操作后要进行判断,是否文件打开,文件真正打开了才能进行后面的读或写操作,如有错误要进行错误处理

● fread:函数原型:size_t fread(void* buff,size_t size,size_t count,FILE* stream)
作用:从文件中读入数据到指定的地址中
参数:第一个参数为接收数据的指针(buff),也即数据存储的地址
第二个参数为单个元素的大小,即由指针写入地址的数据大小,注意单位是字节
第三个参数为元素个数,即要读取的数据大小为size的元素个素
第四个参数为提供数据的文件指针,该指针指向文件内部数据
返回值:读取的总数据元素个数

● fseek:函数原型:int fseek(FILE stream,long offset,int framewhere)
作用:重定位文件内部的指针
参数:第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置
返回值:重定位成功返回0,否则返回非零值
需要注意的是该函数不是重定位文件指针,而是
重定位文件内部的指针,让指向文件内部数据的指针移到文件中我们感兴趣的数据上,重定位主要是这个目的
说明:执行成功,则stream指向以fromwhere为基准,偏移offset个字节的位置。执行失败(比方说offset偏移的位置超出了文件大小),则保留原来stream的位置不变

● ftell:函数原型:long ftell(FILE *fp)
作用:用来返回当前文件指针的位置。
定义在stdio.h头文件中,返回当前文件指针位置,这个位置是当前文件指针相对于文件开头的位移量。
返回值:返回文件指针的位置,若出错则返回-1L

● fclose:函数原型:int fclose(FILE *stream)
作用关闭一个文件流,使用fclose就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区

6.int main(){fork()||fork();}
共创建几个进程:( )
[未学到]

A.1
B.2
C.3
D.4
E.5
F.6

我的回答:D(错误)
正确答案:C
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
在这里插入图片描述
7.在Linux系统中, 为找到文件try_grep含有以a字母为行开头的内容, 可以使用命令?( ) [未学到]

A.grep -E #$ try_grep
B.grep -E #a try_grep
C.grep -E ^$ try_grep
D.grep -E ^a try_grep

我的回答:B(错误)
正确答案:D

8.写出完成以下功能的Linux命令:使用sed命令, 将文件xyz中的单词AAA全部替换为BBB ( ) [未学到]

A.sed ‘s/AAA/BBB’ xyz
B.sed ‘s/AAA/BBB/g’ xyz
C.sed ‘s/AAA/BBB/p’ xyz
D.sed ‘s/AAA/BBB/d’ xyz

我的回答:C(错误)
正确答案:B

● s表示替换命令, /AAA 表示匹配AAA, /BBB 表示把匹配替换成BBB,/g 表示一行上的替换所有的匹配,xyz 表示替换xyz文件中的xyz。
● g 表示行内全面(globe)替换。
● p 表示打印行。
● w 表示把行写入一个文件。
● x 表示互换模板块中的文本和缓冲区中的文本。
● y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)。
● \1 子串匹配标记 。
● & 已匹配字符串标记 。

9.在unix系统下执行chmod(“/usr/test/sample”,0753)之后该文件sample的访问权限为( ) [知识点混淆]

A.拥有者可读写执行,同组用户可写可执行,其他用户可读可执行
B.拥有者可读写执行,同组用户可读写,其他用户可读可执行
C.拥有者可读写执行,同组用户可读可执行,其他用户可写可执行
D.拥有者可读写执行,同组用户可读可执行,其他用户可读写

我的回答:D(错误)
正确答案:C

● 说明:Linux/Unix 的文件调用权限分为三级:文件拥有者[属主]、属组、其他用户。利用chmod可以控制文件如何被他人所调用。
u表示该文件的拥有者[user],
g表示与该文件的拥有者属于组(group),
o表示其他用户[other],
a表示这三者皆是[all]。(常用)
+表示增加权限、(常用)
-表示取消权限、(常用)

=表示唯一设定权限。

取权限:r=4(二进制100),
入权限:w=2(二进制010),
执行或切换权限:x=1(二进制001)

综上所述:/usr 7(0111): 文件拥有者具有 可读可写执行权限,
/test 5(0101):同组用户拥有 可读可执行权限,
/sample 3(0011):其他用户拥有 可写可执行权限。

10.在bash中,在一条命令后加入”1>&2”意味着( ) [未学到]

A.标准输出重定向到标准错误输出
B.标准输入重定向到标准错误输出
C.标准输出重定向到标准输入
D.标准错误输出重定向到标准输入

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

11.若一棵二叉树的前序遍历序列和后序遍历序列分别为1, 2, 3, 4 和 4, 3, 2, 1,则该二叉树的中序遍历序列不会是( )。 [粗心错误]

A.1, 2, 3, 4
B.2, 3, 4, 1
C.3, 2, 4, 1
D.4, 3, 2, 1

我的回答:A(错误)
正确答案:C,C选项中左结点3比2还大,不符合二叉树的规则。

12.一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足?( ) [可能性考虑不全面]

A.所有的结点均无左孩子
B.所有的结点均无右孩子
C.只有一个叶子结点
D.是一棵满二叉树

我的回答:B(错误) 结点全在左树或者右树不作为判断此条件的依据。
正确答案:C

13.给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度
是:( )
[考虑错误]

A.O(n)
B.O(nlogn)
C.O(n^2)
D.O(logn)

我的回答:D(错误)
正确答案:A,二分查找时间复杂度为(O(lgn)或O(n)),以sum/2为中间值进行二分查找,找到与sum/2最接近的整数,如果其小于sum/2则与其右边一个数的和最接近sum,反之则与左边第一个数的和最接近sum。

二分查找实现思路:假设有一升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最中间的元素和关键字key进行比较,如果等于key则返回,如果大于关键字key,则在前一个数据集合中查找,否则在后一个子集中查找,直到找到为止,如果没找到则返回-1。

14.下列排序算法中,在待排序数据已有序时,花费时间反而最多的是( )排序。 [题目不严谨]

A.冒泡
B.希尔
C.快速
D.堆

我的回答:D(错误) 堆在调整的过程中花费的时间不太多。
正确答案:C (指的是未优化过的快速排序)

15.下面程序的输出是:( ) [知识点混淆]

char s[] = "Welcometohengtian";
printf("%s %d",s+7,sizeof(s));

A.Welcometohengtian17
B.tohengtian 18
C.tohengtian 17
D.Welcometohengtian18

我的回答:C(错误)
正确答案:B

16.将一颗有100个结点的完全二叉树从根这一层开始,进行广度遍历编号(从1开始编号),那么编号最小的叶节点
的编号是 ( )
[计算错误]

A.49
B.50
C.51
D.52

他的回答:B(错误) 完全二叉树第n层有2^(n-1)个结点,n层共有(2 ^n) -1个结点。计算得共有50个叶子结点,所以编号从51~100。
正确答案:C

补充:设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树。假如一棵这样的二叉树中有
m(m>0)个叶子结点,那么该二叉树上的结点总数为( )
A.2m+1
B.2m-1
C.2(m-1)
D.2m
他的回答:B(正确)
正确答案:B

不定项选择

1.在Linux上,对于多进程,子进程继承了父进程的下列哪些?( ) [未学到]

A.进程地址空间
B.共享内存
C.信号掩码
D.已打开的文件描述符
E.都不是

我的的回答:BD(错误)
正确答案:BCD

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 3.描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性。 4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈。 5.什么是平衡二叉树? 左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。 6.堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源。 7.什么函数不能声明为虚函数? constructor函数不能声明为虚函数。 8.冒泡排序算法的时间复杂度是什么? 时间复杂度是O(n^2)。 9.写出float x 与“零值”比较的if语句。 if(x>0.000001&&x<-0.000001) 10.Internet采用哪种网络协议?该协议的主要层次结构? Tcp/Ip协议 主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。 11.Internet物理地址和IP地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析協議) 12.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。 13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。 循环链表,用取余操作做 14.不能做switch()的参数类型是: switch的参数不能为实型。 1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分) int a = 4; (A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++); a = ? 答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a; 改后答案依次为9,10,10,11 2.某32位系统下, C++程序,请计算sizeof 的值(5分). char str[] = “http://www.ibegroup.com/” char *p = str ; int n = 10; 请计算 sizeof (str ) = ?(1) sizeof ( p ) = ?(2) sizeof ( n ) = ?(3) void Foo ( char str[100]){ 请计算 sizeof( str ) = ?(4) } void *p = malloc( 100 ); 请计算 sizeof ( p ) = ?(5) 答:(1)17 (2)4 (3) 4 (4)4 (5)4 3. 回答下面的问题. (4分) (1).头文件中的 ifndef/define/endif 干什么用?预处理 答:防止头文件被重复引用 (2). #i nclude 和 #i nclude “filename.h” 有什么区别? 答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。 (3).在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明? 答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变 量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调 用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。 (4). switch()中不允许的数据类型是? 答:实型 4. 回答下面的问题(6分) (1).Void GetMemory(char **p, int num){ *p = (char *)malloc(num); } void Test(void){ char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); } 请问运行Test 函数会有什么样的结果? 答:输出“hello” (2). void Test(void){ char *str = (char *) malloc(100); strcpy(str, “hello”); free(str); if(str != NULL){ strcpy(str, “world”); printf(str); } } 请问运行Test 函数会有什么样的结果? 答:输出“world” (3). char *GetMemory(void){ char p[] = "hello world"; return p; } void Test(void){ char *str = NULL; str = GetMemory(); printf(str); } 请问运行Test 函数会有什么样的结果? 答:无效的指针,输出不确定 5. 编写strcat函数(6分) 已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc); 其中strDest 是目的字符串,strSrc 是源字符串。 (1)不调用C++/C 的字符串库函数,请编写函数 strcat 答: VC源码: char * __cdecl strcat (char * dst, const char * src) { char * cp = dst; while( *cp ) cp++; /* find end of dst */ while( *cp++ = *src++ ) ; /* Copy src to end of dst */ return( dst ); /* return dst */ } (2)strcat能把strSrc 的内容连接到strDest,为什么还要char * 类型的返回值? 答:方便赋值给其他变量 6.MFC中CString是类型安全类么? 答:不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换 7.C++中为什么用模板类。 答:(1)可用来创建动态增长和减小的数据结构 (2)它是类型无关的,因此具有很高的可复用性。 (3)它在编译时而不是运行时检查数据类型,保证了类型安全 (4)它是平台无关的,可移植性 (5)可用于基本数据类型 8.CSingleLock是干什么的。 答:同步多个线程对一个数据类的同时访问 9.NEWTEXTMETRIC 是什么。 答:物理字体结构,用来设置字体的高宽大小 10.程序什么时候应该使用线程,什么时候单线程效率高。 答:1.耗时的操作使用线程,提高应用程序响应 2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。 3.多CPU系统中,使用线程提高CPU利用率 4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独 立的运行部分,这样的程序会利于理解和修改。 其他情况都使用单线程。 11.Windows是内核级线程么。 答:见下一题 12.Linux有内核级线程么。 答:线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两 种类型:“用户级线程”和“内核级线程”。 用户线程指不需要内核支持而在用户程序 中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度 和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现 ,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一 种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部 需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核开支 ,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线 程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不 到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占 用了更多的系统开支。 Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程 13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中? 答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理 堆: 程序运行时动态申请,new 和 malloc申请的内存就在堆上 14.使用线程是如何防止出现大的波峰。 答:意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提 高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队 等候。 15函数模板与类模板有什么区别? 答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化 必须由程序员在程序中显式地指定。 16一般数据库若出现日志满了,会出现什么情况,是否还能使用? 答:只能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记 录日志。也就是说基本上处于不能使用的状态。 17 SQL Server是否支持行级锁,有什么好处? 答:支持,设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据 的一致性和准确性,行级封锁确保在用户取得被更新的行到该行进行更新这段时间内不 被其它用户所修改。因而行级锁即可保证数据的一致性又能提高数据操作的迸发性。 18如果数据库满了会出现什么情况,是否还能使用? 答:见16 19 关于内存对齐的问题以及sizof()的输出 答:编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能 地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问 ;然而,对齐的内存访问仅需要一次访问。 20 int i=10, j=10, k=3; k*=i+j; k最后的值是? 答:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低 21.对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现? 答:将操作多个表的操作放入到事务中进行处理 22.TCP/IP 建立连接的过程?(3-way shake) 答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。   第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状 态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个 SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;   第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1) ,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 23.ICMP是什么协议,处于哪一层? 答:Internet控制报文协议,处于网络层(IP层) 24.触发器怎么工作的? 答:触发器主要是通过事件进行触发而被执行的,当对某一表进行诸如UPDATE、 INSERT 、 DELETE 这些操作时,数据库就会自动执行触发器所定义的SQL 语句,从而确保对数 据的处理必须符合由这些SQL 语句所定义的规则。 25.winsock建立连接的主要实现步骤? 答:服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept() 等待客户端连接。 客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv( ),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。 服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连 接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesock et()关闭套接字。 26.动态连接库的两种方式? 答:调用一个DLL中的函数有两种方法: 1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数 ,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向 系统提供了载入DLL时所需的信息及DLL函数定位。 2.运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或Loa dLibraryEx函数载入DLL。DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的 出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了 。 27.IP组播有那些好处? 答:Internet上产生的许多新的应用,特别是高带宽的多媒体应用,带来了带宽的急剧 消耗和网络拥挤问题。组播是一种允许一个或多个发送者(组播源)发送单一的数据包 到多个接收者(一次的,同时的)的网络技术。组播可以大大的节省网络带宽,因为无 论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。所以说组播 技术的核心就是针对如何节约网络资源的前提下保证服务质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值