- 博客(54)
- 收藏
- 关注
原创 Linux网络编程2(理解局域网)
暂且不关心这个,先看看网络的发展吧,随着计算机的逐渐普及,很多人都想把自己电脑里的东西分享给其他人,没有网络的时候,可以靠U盘来拷贝,但是这样分享资源的时候,还要拿着U盘跑来跑去,效率太低。如果两个电脑之间可以拉一根线,通过这根线把数据传过去,就没这么麻烦了,如果你这么做了,那么恭喜你,你已经构成了最简单一个网络,如下图。我们平时有朋友,有亲人,如果仅仅两个人相互分享,那也太局限了,那其它人也想加入分享圈怎么办呢?没有关系,我们把网线延长一点,再接到新加入的电脑就可以了。如下图。
2024-08-17 17:04:37
543
原创 英语语法之句法(一)
英语语法可能是很多人童年的噩梦,笔者就是其中之一,从小学学到高中,这么多年从来没有理解过英语语法,什么谓语,非谓语,副词,状语,等等概念混淆在一起,傻傻分不清。大家仔细看,这和中文有很大的不同,中文无论是一本书还是多本书,都是“书”这个字,但是英文不一样,英文的book单数和复数之间是有形势变化的,这些针对词的变化规则就是英语中的词法。要想在实际生活中应用英语,就无法避开英语语法的学习,语法是母语人士习惯性表达的一种汇总,为了方便交流,大家都遵照相同规则说和写,就形成了固定的语法规则。
2024-02-13 00:54:25
1359
原创 C++11新特性(lambda,可变参数模板,包装器,bind)
这样看其实也能够很好理解lambda表达式,我们不是嫌弃仿函数自己手动封装类太麻烦了嘛,lambda表达式就是让编译器自动帮我们封装,我们只要把函数的具体实现传过去就可以了,不过lambda表达式的功能比仿函数还是要强大很多的,我们后面慢慢说先看看上面程序的运行结果lambda表达式会自动帮我们推导返回值的类型,所以我们没有在lambda表达式中加上返回值的类型,如果你非想要指定具体的返回值类型,使用表达式中 ->returntype参数。
2023-10-13 19:59:04
391
原创 C++11新特性(右值引用,万能转发)
由运行结果可知,mystring这个匿名对象如果作为参数传递给list,在没有移动构造的情况下,就是使用拷贝构造把这个匿名对象拷贝给list中的元素值,然后自身销毁,有了右值的概念,我们一眼就能看出这个匿名对象是一个将亡值,根本没有必要去拷贝,直接把资源转移给list中的元素值,下图是加上移动构造和移动赋值后的调用情况。这种写法,看似没有拷贝一次,但是别忘了,tmp是在test这个栈帧里创建的,返回值返回后,该栈帧即销毁,tt在引用一块已经销毁的空间,这是绝不允许的。
2023-10-12 00:01:35
380
原创 C++基础语法(多态)
在一些C++书籍上是没有多态概念的,而是采用虚函数来称呼,多态一词多用于Java语言,国内叫习惯了也就这么叫了。事实上,有很多花里胡哨的名词实际上指的都是同一个东西,多是翻译的原因。但多态这个翻译,其实还挺应景,缺点是可能让同笔者一样的新手感到抽象晦涩在具体讲述多态之前,回忆一下继承中的相关概念,还记得在继承中提到的隐藏/重定义概念吗?子类和父类之间的成员如果同名的话,那么就会构成隐藏关系,而且我们也提到,子类是可以切片赋值给父类的,这个过程不涉及到类型转换。
2023-10-04 15:47:08
179
原创 C++基础语法(继承)
继承(inheritance)是类的三大特性之一,继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用继承的概念并不难理解,接下来我们举个例子来看看,继承是如何实现代码的复用的。
2023-10-02 17:06:03
285
原创 Linux系统编程6(线程互斥,锁,同步,生产消费模型)
我们前面提到过,在生产者和消费者模型中,生产者和消费者之间要有互斥和同步的关系,互斥解决方法就是加锁嘛,条件变量就是解决同步的一种常用的方法之一,上面的模型中,超市就是公共资源,消费者消费资源,生产者生产资源,当公共资源没有了,不满足消费者的条件,那么此时消费者不能再来了,老实的挂起等待,反之同理。顾客作为一个单独的个体,其购买的产品量是很低的,如果每个顾客都来,那每次开机就生产那么一点点东西,赚得钱可能连电费都付不起,同样的,顾客想去买东西,还得等你工厂开机生产,等到生产完,可能天都黑了。
2023-09-15 17:24:38
399
原创 Linux系统编程5(线程概念详解)
按照课本上的定义,线程就是进程内部的执行流,有多个执行流就意味着一个进程可以同时进行多个操作,比如视频软件,同时具备播放视频和下载视频的功能,如果只有一个执行流,那么在播放视频时就不能同时下载视频,因为播放视频和下载视频的代码是不同的以前我们一直认为进程是CPU的调度单位,现在我们要改变这个看法,被CPU调度意味着被CPU执行,也就是一个执行流,一个进程里可以有多个线程,线程才是CPU的调度单位。
2023-09-02 17:26:44
1554
原创 Linux网络编程1(网络基础定义)
网络早已成为我们日常生活的一部分,经常使用互联网的人很难长时间内离开互联网。你是否好奇你的电脑仅仅插上一根网线,你发给朋友的聊天信息就能准确无误的到达朋友的手机或者电脑上,你是否好奇为何你仅仅在浏览器输入一个网址,点击一下enter,网页图片和视频就展现在你的眼前,这一切的背后究竟是什么原理?在网络编程的系列学习中,我们将逐渐揭开网络神秘的面纱,不仅要懂网络,还知道如何编写网络程序。
2023-08-23 16:59:22
200
原创 Linux系统编程4(进程信号详解)
在进程间通信这篇文章中,我们学习过信号量这个概念,这里跟大家说一下,信号量和信号完全是两个概念,两者之间没有什么关系。那信号是什么呢?生活中我们常见的信号有信号弹,有红绿灯,看到信号弹,我们就知道了接下来要怎么行动了,看到红绿灯,我们就知道接下来是该走还是该停了,包括各位同学女朋友的脸色,脸色一变就能明白接下来该是讲道理的时间了总结一下信号,信号不仅仅是一种现象,还包括出现这种现象接下来该如何操作的方法,是对即将或者可能出现的某种现象的应对。
2023-08-18 07:15:00
247
原创 Linux系统编程3(进程间通信详解)
进程申请公共资源也是如此,首先公共资源是有限的,信号量就是用来记录公共资源数目的,进程要想访问公共资源,首先要先申请信号量,这就要求信号量本身就得能被所有的进程看到,而能被所有进程看到和使用的资源不就是公共资源嘛,因此信号量本身就是公共资源,其次,进程每申请一份资源,信号量的数目就会--,进程每释放一份资源,信号量的数目就会++,这就要保证++,--操作必须是原子性的,要么完成,要么失败。如上图,这是两个普通进程A和B在系统上工作的原理图,现在想让进程A和B之间进行通信,共享内存的方法是如何做的呢?
2023-08-10 11:04:27
463
1
原创 MySQL数据库操作篇5(索引的原理及用法)
通过前面的学习,我们了解过,在数据库中创建一个表,我们就可以往表中插入数据,然后需要数据的时候在表中查找就行了,普通用户可以直接使用数据库设计者提供的功能,不用关心如何实现查找,作为程序开发人员,我们需要关心这个问题。前面我们讲了很多MySQL中查找数据的方法,但是这些查找总得有个底层的算法实现吧,我们最容易想到的查找算法是遍历,把表中所有的数据都遍历一遍,不就可以查到想要的数据了嘛。
2023-07-24 16:20:46
792
原创 MySQL数据库操作篇4(内置函数&连接查询&子查询)
接下来我们看一下稍微有些麻烦的函数,它们是如何操作的先看看date_add()的用法,这个是往一个给定的日期中增加某个日期单位的数目,然后返回增加后的日期,例如给定一个日期为'2023-7-10',给这个日期加上6天,返回6天后的日期具体操作语句如下:
2023-07-17 22:16:18
467
原创 MySQL数据库操作篇2(表的增删查改&约束)
目录表的基础插入表的约束条件 1.not null约束2. default约束 3.主键约束 复合主键 4.唯一键主键和唯一键的区别 5.comment 约束6.zerofill7. 自增长(auto_increment)8.外键 表的增删查改表中数据的查找表中数据的删除操作 表中数据的更新操作
2023-06-24 02:14:17
1020
原创 Mysql数据库操作篇1(数据类型,库&表修改操作)
当我们的表的编码是utf8时,varchar(L)的参数L最大值是65532/3=21844,因为utf8中,一个字符最多占用3个字节,如果编码是GBK,varchar(L)的参数L最大是65532/2=32766(因为gbk中,一个字符占用2字节)这种“变种”的UTF-8编码被称为“MySQL UTF-8”或“utf8mb3”float的精度损失是比较严重的,默认情况下的float小数位的精度仅为2位,最大精度位数约为7位,如果数据对小数位要求比较高,那么不建议使用float,选择使用decimal。
2023-06-17 17:33:49
2418
原创 数据库入门上篇(数据库基础概念知识)
(具体的一个桌子就是一个实体,但这并不意味着实体必须在现实世界中有具体的形状,实体也可以是个抽象的物体)那么回到上述问题,要想在计算机中存储标明每个桌子,我们就得观察这些桌子的特征了,抽象出能表示出这些桌子的属性信息,例如这些桌子的长,宽,高,颜色,有几个支撑腿等,我们把这些信息一填,是不是就能够描绘出这些桌子大概是个什么样子了。
2023-06-15 16:34:44
476
原创 Linux系统编程2(基础IO详解)
文件描述符fd其实就是文件在文件描述符表中的下标值,在上面的图片中,标准输入的fd为0,因为其在文件描述符表中第一个位置,我们自己打开的文件x.txt的fd为3,因为其在文件描述符表中第四个位置文件描述符就是从0开始的小整数,当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述和管理目标文件,于是就有了结构体表示一个已经打开的文件对象,而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个结构体指针, 指向一个结构体。
2023-05-28 15:59:01
1729
原创 C++实践模拟(vector & list,反向迭代器)
begin表示vector元素的起始位置,_finish指向当前vector已存放的元素中的最后一个元素的下一个位置,_end指向空间的末尾,因为指针的减法结果为元素个数差,所以由_end减去_begin就能得到capacity值,由_finish减去_begin就能得到size的值。我知道这段内容有些难以理解,不理解也是没有关系的。而我们传过去的参数是iterator,iterator和const_iterator不是同一个类,故而不能直接传,这就是报没有适当转化错误的原因。
2023-05-11 02:22:49
707
原创 C++实践模拟(stack,queue & priority_queue,仿函数)
我们上面假设的是一个buffer数组中只能存放3个元素,于是我们要将要找的元素的下标值除以3,那么4/3,商就是1,说明该元素在中控数组下标为1的buffer数组中(这个下标为1是相对中控数组中已存在的位置来衡量的,deque底层有自己的算法来控制,我们不需要操心,如果感兴趣可以去查具体的底层实现细节),接着将该元素对3取模,那么4%3,结果就是1,说明该元素在已指定的buffer数组下标为1的位置,我们看这个元素是11,那么对于真个deque来说,下标为4的元素确实是11。
2023-05-06 08:45:19
284
原创 C++基础语法(模板详解)
不同于普通的函数,模板是不支持声明和定义分离的,因为模板的实例化过程是在编译的阶段完成的,也就是说在编译阶段,模板的定义和声明必须处于同一个文件中//假设我们有一个头文件 `template.h`,其中包含一个模板函数的声明://我们还有一个源文件 `main.cpp`,其中包含了对模板函数的调用:int i = 10;foo(i);return 0;
2023-04-16 16:43:30
618
原创 C陷阱与缺陷
C陷阱与缺陷和高质量C编程这两本书主要是总结一些C编程人员常犯的一些错误,常遇到的一些语法陷阱,及不良的编程风格。无论是有多年经验的编程老手还是刚入门的新手,细细品读,都会有不少的收获和感悟。此篇博客是个人读完这两本书后的一些感悟及对一些内容的记录,方便日后翻阅。 词法陷阱 多个操作字符组在一起的处理方法 编译器中负责将我们编译的命令符号进行分解的部分称为”词法分析器“,而词法分析器在工作运行时采用的处理策略为”贪心法“ 。什么意思呢?举个栗子,如这段语句a---b,编译器在运行时会
2022-07-29 12:38:41
329
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人