03 2017 档案

摘要:变量的类别有递归扩展变量和简单扩展变量。只用一个“=”符号定义的变量被称为递归扩展变量。通过下面例子观察递归扩展变量的特点。 从结果来看,递归扩展变量的引用是递归的。 CFLAGS =$(CFLAGS) -O 上面的赋值代码将会造成一个死循环,无限递归。 简单变量扩展使用“ :=”操作符来定义的。对 阅读全文
posted @ 2017-03-31 11:32 Crystal_Guang 阅读(379) 评论(0) 推荐(0) 编辑
摘要:链表是C语言面试中常见的问题,那么我们今天就实现一个作为练习。之前看过一些关于这方面的资料和 文章,写的都不尽人意,这次写一个具有启发性的历程,由于时间关系,有些东西还是不能一一罗列实现,因为必须要跳过进行下面的学习了,而且我留下的也都是主干之后的细枝末叶,需要花点时间优化。 eg: 考虑周全的代码 阅读全文
posted @ 2017-03-31 10:32 Crystal_Guang 阅读(444) 评论(1) 推荐(0) 编辑
摘要:sum1所用指令步长明显比sum2多,sum2采用等差数列求和方式极大减少了运行时间。 我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯 阅读全文
posted @ 2017-03-29 22:23 Crystal_Guang 阅读(954) 评论(0) 推荐(0) 编辑
摘要:疑惑: 1.我学了c/c++,还是学不出代码? 2.为什么相同功能的程序也是多种多样的? 3.程序的本质是什么? A: 程序是为了具体问题存在的,程序需要围绕问题的解决进行设计,同一个问题可以有多种解决方案。 如何追求程序的性价比?是否有可量化的方法判断程序的好坏? 数据结构起源: 计算机从解决数值 阅读全文
posted @ 2017-03-29 15:41 Crystal_Guang 阅读(309) 评论(0) 推荐(0) 编辑
摘要:特殊变量: 在Makefile中,有两个变量特殊变量会经常用到:MAKE和MAKECMDGOALS。MAKE变量表示的是当前处理Makefile的命令名是什么。当需要在Makefile中运行另一个Makefile时,需要用到这个变量。 MAKECMDGOALS变量表示的是当前构建的目标名。 从测试结 阅读全文
posted @ 2017-03-28 19:55 Crystal_Guang 阅读(437) 评论(0) 推荐(0) 编辑
摘要:红色部分的后置++和--位置是有讲究的,可不能随意变哦。 阅读全文
posted @ 2017-03-28 19:24 Crystal_Guang 阅读(193) 评论(0) 推荐(0) 编辑
摘要:让你的makefile更专业。 在上一个Makefile所在目录下通过touch命令创建一个clean文件,执行make clean,将发现make总是提示clean文件是最新的,而不是按我们期望的那样对项目文件进行清楚操作。make这样的行为,是因为它将clean当做文件来处理,在当前目录下找到了 阅读全文
posted @ 2017-03-27 21:35 Crystal_Guang 阅读(586) 评论(0) 推荐(0) 编辑
摘要:编写makefile,不是一个猛子扎进去试着写一个规则并对之调试,而应该先采用面向依赖关系的思考方法勾勒出makefile要表达怎样的依赖关系,这一点尤为重要。通过不断地练习这种思考方法,才可能达到流畅地编写makefile的能力. 分别编写好两个源文件之后,执行效果如下: makefile文件为: 阅读全文
posted @ 2017-03-26 21:49 Crystal_Guang 阅读(1153) 评论(1) 推荐(0) 编辑
摘要:C语言,同样使用if else while 这样的语法,但不同的人,就是有不同的实现方式,甚至是技巧。 eg: 上面红线处的if语句,是一个值得借鉴的表达式,这也是上一篇博客所说到的,这需要平时的积累,就算都是基本语法,但不同的人能用出不一样的花样。 这个代码还有一点不足,就是如果我把数组改成mat 阅读全文
posted @ 2017-03-26 16:41 Crystal_Guang 阅读(250) 评论(0) 推荐(0) 编辑
摘要:1 #include 2 #include 3 /*基本水平*/ 4 void mycopy1(char *des,char * sou) 5 { 6 unsigned int i; 7 for ( i = 0; i < strlen(sou); i++) 8 { 9 des[i] = sou[i]; 10 } 11 d... 阅读全文
posted @ 2017-03-26 14:52 Crystal_Guang 阅读(215) 评论(0) 推荐(0) 编辑
摘要:指针,C语言永恒的话题。关于指针,在《c和指针》上是这样形容的,指针就是地址的另外一个叫法。所以我们要明白,指针和指针变量的区别,指针就是地址,指针变量是存放指针的变量,即指针变量存放的是地址,我们通过间接访问符可以得到该地址的内容。但是,在一般情况下,我们都把指针变量说成指针这样的简称。例如:vo 阅读全文
posted @ 2017-03-25 19:57 Crystal_Guang 阅读(1592) 评论(0) 推荐(0) 编辑
摘要:map类型通常被称为关联数组,与正常数组类似,不同之处在于其下标不必是整数。我们通过一个关键字而不是位置来查找值(键值对)。 与之相对,set就是关键字的简单集合。当只是想知道一个值是否存在时,set是最有用的。 类似顺序容器,关联容器也是模板,为了定义一个map,我们必须指定关键字和值得类型。例: 阅读全文
posted @ 2017-03-25 12:35 Crystal_Guang 阅读(391) 评论(0) 推荐(0) 编辑
摘要:1 #include 2 int turn_n(int ,int); 3 int main(void) 4 { 5 int test,a=-15,b=0xfffffffe,c=15; 6 printf("%x\n%d\n%x\n",a,b,c); 7 test=turn_n(-15,4); 8 printf("%d\n",test); 9 ... 阅读全文
posted @ 2017-03-24 18:54 Crystal_Guang 阅读(190) 评论(0) 推荐(0) 编辑
摘要:隐式捕获: 出了显式列出我们希望使用的来自函数的变量外,还可以让编译器根据lambda体中的代码来推断我们要使用哪些变量。为了指示编译器推断捕获列表,应在捕获列表中写一个&或=。&告诉编译器采用引用捕获方式,=告诉编译器采用值捕获方式。我们可以混合使用隐式或显式捕获,在此条件下,捕获列表的第一个元素 阅读全文
posted @ 2017-03-24 09:43 Crystal_Guang 阅读(222) 评论(0) 推荐(0) 编辑
摘要:捕获列表,只用于局部非static变量,lambda可以直接使用局部static变量和它所在函数之外声明的名字。 eg: 捕获ma,但是ma并未在使用lambda之前并未定义一个局部的ma,故上诉代码报错。 eg: 此时在外部定义全局变量ma,lambda不用捕获列表,依旧可以在表示内使用ma。 当 阅读全文
posted @ 2017-03-23 15:53 Crystal_Guang 阅读(217) 评论(0) 推荐(0) 编辑
摘要:谓词: 谓词是一个可调用的表达式,其返回结果是一个能用作条件的值。标准库算法所使用的谓词分为两类:一元谓词,意味着它只接受单一参数;二元谓词,意味着它有两个参数。接受谓词参数的算法对输入序列中的元素调用谓词,因此,元素类型必须能转化为谓词的参数类型。典型例子如sort排序算法。 有时候,我们需要更多 阅读全文
posted @ 2017-03-22 13:06 Crystal_Guang 阅读(708) 评论(0) 推荐(0) 编辑
摘要:数学分析法: 我们知道两个加数,一定可以交换它们的值。a+b求得它们的和,比如为sum,但我们完全可以不再定义一个变量sum,而赋值给a或者b都是可以的,为什么呢?因为知道两个数的和,以及其中一个加数,一定可以得到另一个数。所以就算先覆盖一个加数也是无所谓的。得到a+b的和赋值给a之后,要把a和b交 阅读全文
posted @ 2017-03-21 13:22 Crystal_Guang 阅读(344) 评论(0) 推荐(0) 编辑
摘要:所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。 补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。 eg: 阅读全文
posted @ 2017-03-21 10:36 Crystal_Guang 阅读(321) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2017-03-20 12:49 Crystal_Guang 阅读(17) 评论(0) 推荐(0) 编辑
摘要:算法思路(以升序为例): key=A[j];保存需要的比较值,while循环中,A[i]>key,当前key值的前一个值如果大于key值,就把A[i]的值后移一位,此时后移的位覆盖了key,然后i--,又循环重复,一直到循环结束,循环结束时,从小到大排列,但是此时由于之前i--的原因,跳出循环之后, 阅读全文
posted @ 2017-03-19 16:57 Crystal_Guang 阅读(220) 评论(0) 推荐(0) 编辑
摘要:之前的类模板成员函数都定义在类的内部,但是在实际开发中,往往需要将成员函数的实现放在类的外部,先看一个基础类: 然后把上面的代码改成类模板: 这里的学问有很多,友元函数的模板分离有很多要考虑的东西。可细读c++ primer这一章节。 阅读全文
posted @ 2017-03-19 10:46 Crystal_Guang 阅读(541) 评论(0) 推荐(0) 编辑
摘要:与函数模板不同的是,编译器不能为类模板推断模板参数的类型,为了使用类模板,我们必须在模板名后的尖括号中提供额外的消息 用来代替模板参数的模板实参列表。这些额外的信息是显式的模板实参列表,它们被绑定到模板参数。 说明, 阅读全文
posted @ 2017-03-18 21:57 Crystal_Guang 阅读(208) 评论(0) 推荐(0) 编辑
摘要:先看代码,分析调用情况: 函数模板,也可以重载。当函数模板和普通函数名一样时,调用规则是: 1.如果普通函数和函数模板都有完全匹配的参数,优先调用普通函数的,如上面26行代码。 2.函数模板的参数必须严格一致,不能发生隐式转换,但是普通函数可以有隐式类型转换。这个测试需要把上面第一个模板函数屏蔽,调 阅读全文
posted @ 2017-03-18 11:33 Crystal_Guang 阅读(477) 评论(0) 推荐(1) 编辑
摘要:为了实现与数据类型无关的编程,模板应运而生: 模板定义以关键字template开始,后跟模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用小于号(<)和大于号(>)包围起来。当使用模板时,我们隐式或者显式地指定模板实参,将其绑定到模板参数上。(建议都显式指定)。 类型参数前必须使用clas 阅读全文
posted @ 2017-03-17 16:34 Crystal_Guang 阅读(824) 评论(0) 推荐(0) 编辑
摘要:面试题的常客: NOTE: 动态分配了内存,要记得释放,还要,这个代码虽然完成了要求,但是鲁棒性还不够,因为我没有判断给出的数据是否合理分布在数字0-9.或者字符0-9,实际开发中需要做个限定。 阅读全文
posted @ 2017-03-17 10:55 Crystal_Guang 阅读(288) 评论(0) 推荐(0) 编辑
摘要:将10进制转换成2进制,是除以2得到的余数,再倒序排列,这可以用递归实现,也可以用数据结构——栈实现。 先看递归实现: 递归的实现方式,需要一定的逻辑性,如果把上述的打印函数和递归调用调换位置,输出将反向。这里对于递归的基础知识不做解释,如果忘记了,查询相关资料。 这里用递归能够很好的实现把最后求出 阅读全文
posted @ 2017-03-16 15:47 Crystal_Guang 阅读(463) 评论(0) 推荐(0) 编辑
摘要:在一个虚函数的声明语句的分号前加上 =0;就可以将一个虚函数变成纯虚函数,其中,=0只能出现在类内部的虚函数声明语句处。纯虚函数只用声明,而不用定义,其存在就是为了提供接口,含有纯虚函数的类是抽象基类。我们不能直接创建一个抽象基类的对象,但可以创建其指针或者引用。值得注意的是,你也可以为纯虚函数提供 阅读全文
posted @ 2017-03-16 10:52 Crystal_Guang 阅读(6595) 评论(1) 推荐(0) 编辑
摘要:只要是指针,就要符合指针的运算方式,不管你是不是类指针; 如果子类在继承了父类之后,没有增加属性,那么此时他们的步长一致,如果子类增加了属性那么子类的步长将大于父类。 eg: 阅读全文
posted @ 2017-03-15 08:59 Crystal_Guang 阅读(349) 评论(0) 推荐(0) 编辑
摘要:腾讯一道面试题:50个台阶,可以一次走一个台阶,也可以一次走两个台阶,那么走到50个台阶时,有多少种可能? 分析: 任何算法的背后,都隐藏着一个数学理论的支撑,所以大家都知道,数学是进阶算法的基石。 这道题,我们先从最基本的分析,找规律,假设可能情况为an,不难发现,a1=1,a2=2,a3=3,a 阅读全文
posted @ 2017-03-14 14:15 Crystal_Guang 阅读(3673) 评论(0) 推荐(0) 编辑
摘要:之前做过一个测试,在一个类中定义一个virtual修饰的函数时,sizeof这个类,发现类的大小多了恰好一个指针的字节大小,当初不明白,只是记住有这么一个特性。后来,发现它就是c++编译器给我们添加的vptr指针。 当类中声明虚函数时,编译器会在类中生成一个虚函数表; 虚函数表是一个存储成员函数指针 阅读全文
posted @ 2017-03-14 10:49 Crystal_Guang 阅读(4875) 评论(0) 推荐(0) 编辑
摘要:上面的算法可以达到目的,备注也比较清晰了,但这属于基础级。 我们要翻转,首先要数据分离,求得输入数字的位数,求输入数字位数就是一个简单的分离,而我们要想使用最后的数据,又需要结合。 下面展示一个同样达到效果的程序,出自GF之手(^(* ̄(oo) ̄)^); 这份代码非常简洁的完成了要求,倒序输出,但却 阅读全文
posted @ 2017-03-13 19:08 Crystal_Guang 阅读(433) 评论(0) 推荐(0) 编辑
摘要:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列。 在最坏的情况下,查找10次,2^10=1024; Analyze: 阅读全文
posted @ 2017-03-11 16:10 Crystal_Guang 阅读(335) 评论(0) 推荐(0) 编辑
摘要:函数重载: 必须在同一个类中进行; 子类无法重载父类的函数,父类同名函数将被子类名称覆盖; 重载是在编译期间根据参数类型和个数决定函数的调用(静态联编)。 函数重写与重定义: 重写: 必须发生在基类和派生类之间,并且父类与子类的函数必须有完全相同的函数原型; 使用virtual关键字声明之后能够产生 阅读全文
posted @ 2017-03-11 13:57 Crystal_Guang 阅读(865) 评论(0) 推荐(0) 编辑
摘要:先看代码: 这样是没问题的(c++编译器会以构造相反的顺序执行析构函数),但是,在很多时候,我们不能在调用函数末尾就delete掉这个内存,还需要和后续交互。比如作为函数参数,为了实现多态,我们函数参数是父类的指针,所以更常见和一般的设计思维是更改paly和main函数如下: 运行结果显示内存泄漏了 阅读全文
posted @ 2017-03-11 11:55 Crystal_Guang 阅读(352) 评论(0) 推荐(0) 编辑
摘要:先看一个例子: 然后我们引进多态,看看代码升级的威力; 用多态的好处:调用一个函数,简化代码结构,关键在于可维护性好。如果现在我又派生了一个类L3,只用调用函数的接口,就可以仅仅增加一个类定义的情况下,完成项目的维护。 实现多态三要素: 1、要有public继承; 2、要有虚函数重写; 3、要有基类 阅读全文
posted @ 2017-03-10 09:50 Crystal_Guang 阅读(343) 评论(0) 推荐(0) 编辑
摘要:输出: 很奇怪,为什么在子进程中调用父进程的PID会是1224,而parent明明是3973啊,有点晕。 为了追踪代码进程,我在上述代码最后加了一个while(1)循环,不加还好,加了之后更晕了。 输出: 啊,为什么又对了啊,加了一个循环阻塞之后,子进程中调用父进程的PID显示和parent一样了。 阅读全文
posted @ 2017-03-09 16:01 Crystal_Guang 阅读(457) 评论(0) 推荐(1) 编辑
摘要:图一 图二 先测试图一结构的多继承: 虚继承的目的是令某个类做出声明,承诺愿意共享它的基类。其中,共享的基类对象称为虚基类。在这种机制下,无论虚基类在继承体系中出现多少次,在派生类中都只包含唯一一个共享的虚基类对象。 为了说明情况,我们把上述代码更改如下: 1 #include<iostream> 阅读全文
posted @ 2017-03-06 20:25 Crystal_Guang 阅读(16878) 评论(0) 推荐(1) 编辑
摘要:上诉代码,如果直接使用子类对象调用子类的某个和父类同名函数或者使用同名变量,默认使用子类的,但我们可以加上域作用符强制使用父类的属性或者方法。 同名函数再探: 当且仅当对通过引用或者指针调用虚函数时,才会在运行时解析该调用,也只有在这种情况下对象的动态类型才有可能与静态类型不同。 一旦某个函数被声明 阅读全文
posted @ 2017-03-05 15:34 Crystal_Guang 阅读(739) 评论(0) 推荐(0) 编辑
摘要:基类也叫父类,派生类也叫子类。 类之间的继承关系继承关系是类之间的父子关系。 继承关系的特点如下:A、 子类拥有父类的所有属性和行为B、 子类也是一种特殊的父类C、 子类对象可以当父类对象使用D、 子类中可以添加父类没有的属性和方法E、 子类对象可以直接初始化父类对象F、 子类对象可以直接赋值给父类 阅读全文
posted @ 2017-03-05 13:22 Crystal_Guang 阅读(1532) 评论(1) 推荐(0) 编辑
摘要:一个进程默认打开三个文件描述符: STDIN_FILENO 0STDOUT_FILENO 1STDERR_FILENO 2 man 2 open可查看详情; open函数可以打开或者创建一个文件: #include <sys/types.h>#include <sys/stat.h>#include 阅读全文
posted @ 2017-03-04 10:56 Crystal_Guang 阅读(1505) 评论(0) 推荐(0) 编辑
摘要:在Windows下我们习惯的操作,复制单个字符,复制单行多行,删除单行多行,在linux的vim中操作如下: G(shift+g+g):跳到文档尾 g+g:跳转到文档首 home键:光标移动到行首 end键:光标移动到行尾 yy:复制光标所在行的整行内容 yw:复制光标所在单词的内容 nyy:复制从 阅读全文
posted @ 2017-03-03 17:07 Crystal_Guang 阅读(985) 评论(0) 推荐(0) 编辑
摘要:派生类必须通过使用类派生列表, 明确指出它是从哪个(哪些)基类继承而来的。类派生列表的形式是:首先是一个冒号,后面紧跟以逗号分隔的基类列表(可以多继承,但一般不使用多继承),其中每个基类前面可以有以下三种访问说明符中的一个:public,private,protectedd。 c++语言中,基类必须 阅读全文
posted @ 2017-03-03 11:18 Crystal_Guang 阅读(2647) 评论(0) 推荐(1) 编辑
摘要:在重载输出输入运算符的时候,只能采用全局函数的方式(因为我们不能在ostream和istream类中编写成员函数),这里才是友元函数真正的应用场景。对于输出运算符,主要负责打印对象的内容而非控制格式,输出运算符不应该打印换行符;对于输入运算符,必须处理可能失败的情况(通常处理输入失败为默认构造函数的 阅读全文
posted @ 2017-03-02 11:12 Crystal_Guang 阅读(38414) 评论(0) 推荐(3) 编辑
摘要:c++语言并不要求递增和递减运算符必须是类的成员,但是因为它们改变的正好是所操作对象的状态,所以建议将其设定为成员函数。(但下面的代码为了练习,还是分别采用成员函数和全局函数的方式实现) 业余实现代码: NOTE: 后置版本接受一个额外的参数(不被使用)int类型的参数(必须是int类型的)。当我们 阅读全文
posted @ 2017-03-01 22:21 Crystal_Guang 阅读(9847) 评论(3) 推荐(0) 编辑
摘要:C语言中,前置和后置++,--都不能作为左值,而在c++中,前置的++和--可以作为左值,从下面的重载运算符中也可以看出,它们返回的是引用,我不知道为什么这里和c语言中不同,但c++类似的提升还有三目运算符?:,在c中也不可以做左值,但c++中可以。或者是因为c++提出了引用,进而对c做了一定的提升 阅读全文
posted @ 2017-03-01 15:29 Crystal_Guang 阅读(1857) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示