
C++
文章平均质量分 69
分享记录C/C++
wohu007
这个作者很懒,什么都没留下…
展开
-
C++ 笔记(36)— 接收输入字符串的几种方法
C++中常见的几种输入字符串的方法如下:std::cin、std::cin.get()、std::cin.getline()、std::getline()、std::gets()、std::getchar()1. std::cin1.1 最常用、最基本的用法,输入一个数字#include <iostream>int main(){ int a, b; std::cin >> a >> b; std::cout << a +转载 2021-08-09 20:41:50 · 8733 阅读 · 0 评论 -
C++ 笔记(36)—— std::cout 输出保留小数位数
需要头文件 #include <iomanip>setprecision() 来用来保存有效数字,fixed 和 setprecision() 一起用就变成保存小数点后有效数字。fixed 可以通过 cout.unsetf(ios::fixed) ; 这段代码关掉。不然会一直开着。fixed 有个地方需要注意的是可以保存的有效数字包括0,不开 fixed 的话,即使保存3个有效数字,小数点后的0也会自动省略。即 1.2 要是 setprecision(3) 结果还是1.2 而不是1.原创 2021-08-08 08:52:10 · 11475 阅读 · 2 评论 -
C++ 笔记(35)— std::to_string 转换整形数字为字符串
1. 函数原型string to_string (int val);string to_string (long val);string to_string (long long val);string to_string (unsigned val);string to_string (unsigned long val);string to_string (unsigned long long val);string to_string (float val);string to_str原创 2021-08-07 17:38:18 · 991 阅读 · 0 评论 -
C++ 笔记(34)— C++ exit 函数
当遇到 main 函数中的 return 语句时,C++ 程序将停止执行。但其他函数结束时,程序并不会停止。程序的控制将返回到函数调用之后的位置。然而,有时候会出现一些非常少见的情况,使得程序有必要在 main 以外的函数中终止。要实现这一点,可以使用 exit 函数。当调用 exit 函数时,无论是哪个函数包含了该调用,都将导致程序停止。见如下示例代码:#include <iostream>#include <cstdlib>using namespace std;原创 2021-07-08 20:27:05 · 928 阅读 · 0 评论 -
C++ 笔记(33)— C/C++ 程序员常见面试试题深入剖析
1. 找错题试题1:void test1(){ char string[10]; char* str1 = "0123456789"; strcpy(string, str1);} 错误原因:字符串 str1 需要 11 个字节才能存放下(包括末尾的 \0),而 string只有 10 个字节的空间,strcpy会导致数组越界;试题2:void test2(){ char string[10], str1[10]; int i; for(i=0; i<10; i++)原创 2021-07-07 20:16:23 · 643 阅读 · 5 评论 -
C++ 笔记(32)— 预处理、文件包含include、宏替换define、条件包含ifndef、define
C/C++语言通过预处理器提供了一些语言功能。从概念上讲,预处理器是编译过程中单独执行的第一个步骤。两个最常用的预处理器指令是:#include指令( 用于在编译期间把指定文件的内容包含进当前文件中);#define指令( 用任意字符序列替代一个标记);1. 文件包含文件包含指令( 即 #include指令)使得处理大量的 #define指令以及声明更加方便。在源文件中,任何形如:#include “文件名”或者#include <文件名>的行都将被替换为由文件名指定的文原创 2021-06-23 23:03:16 · 1492 阅读 · 2 评论 -
C++ 笔记(31)— 类继承
1. 私有和保护成员函数或成员数据可以是公有或者私有的。如果是公有的,那么它们可以被直接访问;如果是私有的,那么它们无法被直接访问。同时,还有一个 protected 保留字,在没有使用继承的时候,它与 private 的效果是一样的,即无法被直接访问。如果使用了继承,我们就能体会到 protected 和 private 的差别。private(私有)和 protected(保护)都能实现类的封装性。private 能够对外部和子类保密,即除了成员所在的类本身可以访问之外,别的都不能直接访问;原创 2021-06-22 22:00:22 · 315 阅读 · 2 评论 -
C++ 笔记(30)— 友元函数与友元类
我们知道类的私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。C++ 设计者认为, 如果有的程序员真的非常怕麻烦,就是想在类的成员函数外部直接访问对象的私有成员,那还是做一点妥协以满足他们的愿望为好,这也算是眼前利益和长远利益的折中。因此,C++ 就有了友元(friend)的概念。打个比方,这相当于是说:朋友是值得信任的,所以可以对他们公开一些自己的隐私。友元原创 2021-06-15 22:47:09 · 372 阅读 · 0 评论 -
C/C++ 编程规范(02)— 标识符命名
标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一 些单词有大家公认的缩写。示例:如下单词的缩写能够被大家基本认可。temp 可缩写为 tmp ;flag 可缩写为 flg ;statistic 可缩写为 stat ;increment 可缩写为 inc ;message 可缩写为 msg ;命名中若使用特殊约定或缩写,则要有注释说明。说明:应该.原创 2021-06-12 22:23:34 · 676 阅读 · 2 评论 -
C/C++ 编程规范(01 )— 排版
程序块要采用缩进风格编写,缩进的空格数为 4 个 。相对独立的程序块之间、变量说明之后必须加空行。if (!valid_ni(ni)){... // program code}repssn_ind = ssn_data[index].repssn_index;repssn_ni = ssn_data[index].ni;较长的语句(>80 字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。p.原创 2021-06-11 23:11:04 · 1461 阅读 · 3 评论 -
C++ 笔记(29)— 结构体、结构体作为函数参数、作为返回值、结构体数组、结构体指针、typedef 定义结构体
1. 结构体定义结构体是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。为了定义结构,必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:struct type_name { member_type1 member_name1; member_type2 member_name2; member_type3 member_name3; ...} object_names;t原创 2021-06-08 23:05:12 · 10199 阅读 · 8 评论 -
C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的。1. NULL 在 C/C++ 中的定义先来看下 C99 是怎么定义 NULL 的:NULL can be defined as any null pointer constant. Thus existing code can retain definitions of NULL as 0 or 0L, but an原创 2021-05-15 23:15:26 · 906 阅读 · 0 评论 -
C++ 笔记(27)— 指针变量、数组和指针、指针数组、数组指针、指针常量与常量指针
1. 什么是指针变量?指针变量是专门有一个变量来存放指针。int main(int argc, char *argv[]){ int a = 10; int *p = &a; //通过取地址符号 & 把 a 变量的地址传给指针变量 p std::cout << "p is " << p << std::endl; // p is 0x7fffe740301c std::cout << "&am原创 2021-01-12 22:14:19 · 261 阅读 · 0 评论 -
C++ 笔记(26)— 主函数 main(int argc, char *argv[]) 参数说明
带形参的 main 函数,如main( int argc, char* argv[], char **env )是 UNIX 、Linux 以及 Mac OS 操作系统中 C/C++ 的 main 函数标准写法,并且是血统最纯正的 main 函数写法。1. argc、argv的具体含义argc:(argument count)int 型的 argc ,用来统计程序运行时发送给 main 函数的命令行参数的个数,在 VS 中默认值为 1。argv:(argument vector)char原创 2020-11-01 22:49:04 · 592 阅读 · 0 评论 -
C++ 笔记(25)— 理解 C++ 中的头文件和源文件的作用
1. C++ 编译模式通常,在一个 C++ 程序中,只包含两类文件:.cpp 文件,被称作 C++ 源文件,里面放的都是 C++ 的源代码.h 文件,被称作 C++ 头文件,里面放的也是 C++ 的源代码。C++ 语言支持 “分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的 .cpp 文件里。.cpp 文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文转载 2020-09-10 22:46:10 · 718 阅读 · 0 评论 -
C++ 笔记(24)— STL map 类(map实例化、插入、查找、删除)
1. STL 映射类简介map 和 multimap 是键-值对容器,支持根据键进行查找,区别在于,后者能够存储重复的键,而前者只能存储唯一的键。为了实现快速查找, STL map 和 multimap 的内部结构看起来像棵二叉树。这意味着在 map 或multimap 中插入元素时将进行排序;还意味着不像 vector 那样可以使用其他元素替换给定位置的元素,位于 map 中特定位置的元素不能替换为值不同的新元素,这是因为 map 将把新元素同二叉树中的其他元素进行比较,进而将它放在原创 2020-09-09 22:20:26 · 1091 阅读 · 0 评论 -
C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)
1. vector 特点vector 是一个模板类,提供了动态数组的通用功能,具有如下特点:在数组末尾添加元素所需的时间是固定的,即在末尾插入元素的所需时间不随数组大小而异,在末尾删除元素也如此;在数组中间添加或删除元素所需的时间与该元素后面的元素个数成正比;存储的元素数是动态的,而 vector 类负责管理内存;要使用 std::vector 类,需要包含下面的头文件:#include <vector>2. 实例化 vector要实例化 vector ,需要指定要在原创 2020-09-08 22:39:42 · 12347 阅读 · 1 评论 -
C++ 笔记(22)— STL string 类(字符串赋值、访问、拼接、查找、翻转、大小写转换)
1. 实例化和赋值 STL string#include <string>#include <iostream>int main (){ using namespace std; const char* a = "Hello String!"; cout << "a is: " << a << endl; std::string b (a); // constructor cout <<原创 2020-09-07 22:16:16 · 813 阅读 · 0 评论 -
C++ 笔记(21)— 处理文件(文件打开、关闭、读取、写入)
C++ 提供了 std::fstream ,旨在以独立于平台的方式访问文件。 std::fstream 从 std::ofstream 那里继承了写入文件的功能,并从 std::ifstream 那里继承了读取文件的功能。换句话说, std::fstream 提供了读写文件的功能。数据类型描述ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。ifstream该数据类型表示输入文件流,用于从文件读取信息。fstream该数据类型通常表示文件原创 2020-09-06 22:21:32 · 2308 阅读 · 0 评论 -
C++ 笔记(20)— 异常处理(抛出异常、捕获异常)
异常提供了一种转移程序控制权的方式。 C++ 异常处理涉及到三个关键字: try 、 catch 、 throw 。throw : 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。catch : 在您想要处理问题的地方,通过异常处理程序捕获异常。 catch 关键字用于捕获异常。try : try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。原创 2020-09-05 21:45:00 · 8674 阅读 · 3 评论 -
C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)
C++ 标准库可以分为两部分:标准函数库: 这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。面向对象类库: 这个库是类及其相关函数的集合。C++ 标准库包含了所有的 C 标准库,为了支持类型安全,做了一定的添加和修改。标准函数库标准函数库分为以下几类:输入/输出 I/O字符串和字符处理数学时间、日期和本地化动态分配其他宽字符函数面向对象类库标准的 C++ 面向对象类库定义了大量支持一些常见操作的类,比如输入/输出 I/O、字符串处理、原创 2020-09-03 22:58:24 · 375 阅读 · 0 评论 -
C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数)
1. this 指针在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。 this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。在类中,关键字 this 包含当前对象的地址,换句话说,其值为 &object 。当您在类成员方法中调用其他成员方法时,编译器将隐式地传递 this 指针—函数调用中不可见的参数:class Human{ pr原创 2020-09-02 22:16:05 · 973 阅读 · 0 评论 -
C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)
1. 构造函数构造函数是一种特殊的函数(方法),在根据类创建对象时被调用。构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。类似于 Python 类中的 __init__() 函数。1.1 声明和实现构造函数通过下面示例理解构造函数,Human 类的构造函数的声明类似于下面这样:class Human{ public: Human(); //构造函数声明};这个构造函数可在类声明中实现,也可在类声明外实原创 2020-09-01 22:38:15 · 544 阅读 · 0 评论 -
C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)
1. 类的定义类定义是以关键字 class 开头,后跟类的名称。并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号。类声明将类本身及其属性告诉编译器。类声明本身并不能改变程序的行为,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。例如,我们使用关键字 class 定义 Box 数据类型,如下所示:class Box{ // 成员属性 double length; // 盒子的长度 double breadth; // 盒原创 2020-08-29 23:10:07 · 1256 阅读 · 0 评论 -
C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)
引用是变量的别名。也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。1. 创建引用要声明引用,可使用引用运算符 & ,如下面的语句所示:VarType original = Value;VarType& ReferenceVariable = original;有如下变量int i = 0;我们可以为 i 声明引用变量,如下所示:int& r = i;double& s = d;在这些原创 2020-08-28 22:02:41 · 4096 阅读 · 0 评论 -
C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)
1. 声明指针指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type *var-name;type 是指针的基类型,它必须是一个有效的 C++ 数据类型;var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:int *ip; /* 一个整型的指针 *原创 2020-08-27 22:39:32 · 4602 阅读 · 0 评论 -
C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)
每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。1. 函数声明函数声明告诉编译器函数的名称、返回类型和参数。函数声明包括以下几个部分:return_type function_name( parameter list );函数声明示例:int max(int num1, int num2);在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:int max(int, int);函数可接受用逗号分隔的原创 2020-08-26 22:46:36 · 590 阅读 · 0 评论 -
C++ 笔记(12)— 判断(if/if...else/switch、条件运算符)
1. if 语句C++ 中 if 语句的语法:if(boolean_expression){ // 如果布尔表达式为真将执行的语句}如果布尔表达式为 true ,则 if 语句内的代码块将被执行。如果布尔表达式为 false ,则 if 语句结束后的第一组代码(闭括号后)将被执行。C++ 语言把任何非零和非空的值假定为 true ,把零或 null 假定为 false 。因此,在条件语句中,只要表达式的结果不为零(负数或正数),就被视为结果为 true 。2. if … e原创 2020-08-25 22:08:30 · 1935 阅读 · 1 评论 -
C++ 笔记(11)— 循环(while/for/do while/嵌套循环、break/continue/goto 循环控制语句)
1. while 循环C++ 中 while 循环的语法:while(condition){ statement(s);}2. for 循环2.1 典型 for 循环C++ 中 ** ****for** 循环的语法:for ( init; condition; increment ){ statement(s);}下面是 for 循环的控制流:init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要原创 2020-08-24 22:02:57 · 3380 阅读 · 0 评论 -
C++ 笔记(10)— 运算符(算术、关系、逻辑、位运算、赋值和其它运算符)
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。 C++ 内置了丰富的运算符,并提供了以下类型的运算符:算术运算符关系运算符逻辑运算符位运算符赋值运算符其它运算符1. 算术运算符运算符描述实例+把两个操作数相加A + B 将得到 30-从第一个操作数中减去第二个操作数A - B 将得到 -10*把两个操作数相乘A * B 将得到 200/分子除以分母B / A 将得到 2%取模运算符,整除后的余数B % A 将得到原创 2020-08-23 21:05:06 · 4176 阅读 · 0 评论 -
C++ 笔记(09)— 字符串(C 风格字符串、C++字符串 string)
C++ 提供了以下两种类型的字符串表示形式:C 风格字符串;C++ 引入的 string 类类型;1. C 风格字符串C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。下面的声明和初始化创建了一个 “Hello” 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。char a[6]={'H',原创 2020-08-22 22:20:21 · 360 阅读 · 0 评论 -
C++ 笔记(08)— 数组(数组的声明、初始化、访问及修改数组元素)
数组具有如下特点:数组是一系列元素;数组中所有元素的类型都相同;所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。1. 一维数组1.1 声明数组要声明一个数组,需要指定元素的类型和元素的数量,如下所示:type arrayName[ arraySize ];arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C++ 数据类型。例如,要声明一个类型为 double 的包含 10 个元素的数组 balance,声明语句如下:原创 2020-08-21 22:54:13 · 6141 阅读 · 1 评论 -
C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)
在 C++ 中,常量类似于变量,只是不能修改。与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容。常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。在 C++ 中,常量可以是:字面常量;使用关键字 const 声明的常量;使用关键字 constexpr 声明的常量表达式( C++11 新增的);使用关键字 enum 声明的枚举常量;使用 #define 定义的常量(已摒弃,不推荐);1. 字面常量字面常量可以原创 2020-08-20 22:11:37 · 2373 阅读 · 0 评论 -
C++ 笔记(06)— 变量作用域(局部变量、全局变量、静态局部变量)
作用域是程序的一个区域,一般来说有三个地方可以定义变量:在函数或一个代码块内部声明的变量,称为局部变量;在函数参数的定义中声明的变量,称为形式参数;在所有函数外部声明的变量,称为全局变量;1. 局部变量在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用。下面的实例使用了局部变量:#include <iostream>using namespace std;int main(){ // 局部变量声明 int a, b;原创 2020-08-19 22:28:46 · 3424 阅读 · 0 评论 -
C++ 笔记(05)— 变量(变量定义、声明、初始化、extern关键字、变量之间转换)
1. 变量定义变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:type variable_list;在这里,type 必须是一个有效的 C++ 数据类型,可以是 char 、 wchar_t 、 int 、 float 、 double 、 bool 或任何用户自定义的对象,variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明:int i原创 2020-08-18 22:18:54 · 9793 阅读 · 1 评论 -
C++ 笔记(04)— 数据类型(各类型占用内存 sizeof、typedef 声明)
编程语言中变量保存的是它所存储值的内存位置。也就是说在创建一个变量时,就会在内存中开辟一些空间。操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么。1. 基本数据类型类型关键字布尔型bool字符型char整型int浮点型float双浮点型double无类型void宽字符型wchar_t其实 wchar_t 定义如下:typedef short int wchar_t;也就是说 wchar_t 实际上的原创 2020-08-17 22:31:01 · 1360 阅读 · 0 评论 -
C++ 笔记(03)— 命名空间(概念、定义、调用、using name 指令、嵌套命名空间)
1. 命名空间概念在 C++ 应用程序中, 您可能会写一个名为 func() 的函数,在另一个可用的库中也存在一个相同的函数 func() 。这样,编译器就无法判断您所使用的是哪一个 func() 函数。因此,引入了命名空间概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。命名空间是给代码指定的名称,有助于降低命名冲突的风险。2. 定义命名空间命名空间的定义使用关键字 namespace原创 2020-08-16 21:20:44 · 1354 阅读 · 0 评论 -
C++ 笔记(02)— 程序结构(头文件说明、命名空间、函数返回值、函数参数、注释、语句结束符、cin/cout)
先看以下代码#include <iostream>#include <string>using namespace std;int main() // main() 是程序开始执行的地方{ int num; // 声明了一个名为 num 的变量,用于存储类型为int 的数据。 cout << "Enter your number" << endl; cin >> num; // 使用 cin 将输入的数字存储在该原创 2020-08-15 22:45:28 · 585 阅读 · 0 评论 -
C++ 笔记(01)— 环境设置(安装g++、g++ 编译 C++、 生成可执行文件流程、解释器与编译器区别)
1. g++安装在 Linux 或者 UNIX 系统上,可以通过下面命令来查看是否安装了 GCC 。$ g++ -v如果已经安装 GNU 编译器,则有以下输出:wohu@wohu:~/C++$ g++ -vUsing built-in specs.COLLECT_GCC=g++COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapperTarget: x86_64-linux-gnuConfigured with:原创 2020-08-14 23:23:37 · 1073 阅读 · 0 评论 -
通过修改软链接升高 gcc 版本、降低 gcc 版本
1. 查看 gcc 版本wohu@ubuntu16:/etc/apt$ gcc --versiongcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0Copyright (C) 2017 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY o原创 2020-07-15 22:30:25 · 5489 阅读 · 1 评论