那些你看完第一章就扔掉的书

2020网易笔试编程题(三) 题目:现在有n个物品,每一个物品都有一个价值,现在想将这些物品分给两个人,要求这两个人每一个人分到的物品价值总和相同(个数可以不同,总价值相同即可),剩下的物品就需要扔掉,现在想知道最少需要扔多少价值的物品才能满足要求分给两个人。 ... 阅读详情

前言:有很多书,被别人安利以后,自己兴致勃勃地捧起来,但是看完第一章就放弃了,《深入理解计算机系统》就是其中著名的一本,第一章漫游了计算机系统,还比较简单。第二章就是信息表示、补码、浮点数,太枯燥。再往后一翻,第三章干脆是汇编,算了,放弃吧。

今天转载一篇文章,讲了作者阅读《深入理解计算机系统》的心得体会,希望给大家一点儿启发。

c386390a813abffe3b49be64b8c41dde.jpeg

终于把《深入理解计算机系统》第三章的笔记整理好了,前前后后大概用了小半年时间,中间还经历了一次上海疫情。在这个系列笔记完成之际,突然想起了一位网友的问题“现在学习 CSAPP 对我的工作有帮助吗?”

在学习之前,我其实也有同样的疑问。大致看了一遍书,还做了一份笔记之后,对这个问题也有了一些自己的感受。

思考这个问题的过程,让我想起了刘润老师的一本书《底层逻辑》。是的,这个问题最好的回答就是“从底层逻辑开始”。

接下来我就从 Why / What / How 三个角度来聊聊我的理解和学习收获。

1. Why

拿书本的第三章为例,这个章节的英文叫做 Machine-Level Representation of Programs,翻译过来就是“程序的机器级别表示”。

大家平时工作中使用的都是 Java,C#,JavaScript 等这类高级编程语言。而且我们在工作中也不需要使用汇编这类的低级语言。

那么我们现在为什么要去学习“程序的机器级别表示”呢?

我在看到码农翻身的一篇文章后对这个问题恍然大悟。文章中提到 Stack Overflow 的创始人 Joel Spolsky 一个理论:抽象泄漏法则。

1.1 抽象泄漏法则

以编程语言为例,这就是一个不断向上抽象的产物。

从机器语言开始到汇编语言,然后到 c/c++ 高级语言,再到 Java,C#,JavaScript 等高级编程语言,总是在不断地抽象。

Joel Spolsky 说:

All non-trivial abstractions, to some degree, are leaky.(所有非琐碎的抽象,在某种程度上,都是泄露的。)

895ed8d6030ec0a638635b5952501ac9.png

比如在高级语言中,会将 string 抽象成像 int 一样来使用。我们可以使用加号将两个字符串串联,就像这样: "foo" + "bar"。

当我们这么使用的时候,可能会有资深的程序员告诉大家,串联字符串时最好使用 StringBuilder 类。我们会记住这个用法,但是不一定能理解为什么。

这其实就是抽象的泄露。

在低级别语言中其实并没有字符串这个类型,只有char *,字符串就是一个 char 的数组。

理解到这一层,再回头看看 StringBuilder 类,就会知道底层的原理,就是一个数组。

d8d444570d17771f3faab5f3f323b35b.png

所以 Joel Spolsky 说:

the abstractions save us time working, but they don’t save us time learning. (抽象可以节省我们的工作时间,但不能节省我们的学习时间。)

*Joel Spolsky 原文:[The Law of Leaky Abstractions]

https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/

1.2 理解基础知识

从底层开始学习,还能够更好地理解编程的基础知识,这是我在学习过程中感触最深的地方。举两个例子:闭包和递归。

a. 闭包

前端开发的朋友第一次遇到闭包问题,可能都是从一段 for 循环不能正常执行开始。

for (var i = 0; i < greetings.length; i++) {
    ...
}

我们会发现将 var 写成 let 就可以正常工作了。

闭包到底是什么原因导致的?

当我们知道了函数栈帧和堆的概念之后,再去找找相应的专业文章,就能够从原理上理解闭包这个概念。

e8fb2bcc0db60e7f5c442cebe358c0ca.png

*这里推荐一下我翻译的一篇文章:[JavaScript 闭包在 Heap 中的表示]

https://zhuanlan.zhihu.com/p/468527405

b. 递归
记得我第一次跟踪递归实现汉诺塔的算法时,完全是一团浆糊。这个问题同样也可以从底层逻辑来搞明白。

当我们清楚了函数栈帧的概念,知道了每次函数调用都有自己的栈帧,知道了栈帧里面保存了局部变量。

这时候再回过头来理解递归,其实就是基于栈帧这个概念,生成一条栈帧链,实现的从大到小,从整体到局部一个推导过程。

递归是计算机基于自己的运算特性(栈帧),形成了自己独特地处理问题的方式,这种方式有别于人类的正常思维。作为程序员,我们需要理解并按照这种方式编写自己的代码。

9beb816ec1deb8aed58200edea614708.gif

*阶乘递归实现的状态机

2. What

什么是 “程序的机器级别表示” ?我们可以理解为汇编语言。

在了解汇编语言之前,我们还需要从程序的视角对一些硬件有大致的认识。什么是内存?什么是寄存器?什么是程序计数器?……

产生这些疑问,其实也是因为汇编也是一种抽象,是机器语言的抽象。

我们当然可以跳过这部分知识。但是如果能了解这些知识,的确可以帮助我们学习。

从书中的内容,我整理出下面这几部分内容,可以帮助大家快速理解这些概念。

  从程序的角度看,内存是什么?

  内存的布局

  寄存器

ddb24ccfb3472afb570a78474fc6b1b6.png

*内存的布局

理解了这些知识点后,如何理解什么是汇编语言呢?

这里我还想推荐一本书——《编码》,顺便也介绍一种选择书籍的好办法,概括起来就三个字:白,浅,透。

对新手来说,一听就明白。对专业人士来说,讲解的方式浅显易懂。对高手来说,道理讲得很透彻。

《编码》这本书的确是难得的“白,浅,透”三方面都做得特别好的入门书籍。

我们在这本书中可以看到,一个简单的逻辑门如何一步一步地演变出指令的过程。看完之后,大家对计算机、对汇编语言一定会有深刻的理解。

df4a30eca86b98ed028ad1f924a9cb85.jpeg


3. How

如何学习汇编语言呢?

要知道我们学习的目的不是为了能够编写汇编代码,而是能够看懂。所以学习起来相对简单。

我将第三章的内容分成了三部分。

首先,第一部分我们需要学习基本的指令形式,就像学习编程语言时我们需要先学基本语法一样。

  指令1 - MOV

  指令2 - LEA

  指令3 - 算术和逻辑 

  指令4 - PUSH 和 POP

  指令5 - CALL 和 RET

eb4bf590c514804700798f359b52bfbd.gif

*POP 指令的执行

然后,第二部分在学习函数相关的知识,这一部分我们可以学到栈和栈帧的概念。

  程序运行时的栈

  栈帧的布局

38f39d9261f5a4434a6421dd7e454fff.png

*栈帧的布局

最后,掌握一下条件分支的知识,看看条件分支是如何实现编程语言中 `if` 和 循环语句的,也能够明白递归到底是怎么回事。

  条件码寄存器

  条件分支

  循环

  递归

01832d0c74a90de814bf45da716b7e51.gif

*递归运行时栈的情况

汇编语言作为一门低级语言,相比其他高级语言来说语法非常简洁,如果只要做到能够看懂,并不用花费太长时间。

4. One More Thing

学习“程序的机器级别表示”,看上去我们一直在研究汇编语言。然而这仅仅是个开始,从这里起步,在接下来的章节中我们可以看到操作系统的其他特性,比如虚拟、并发、持久化等等知识。

最后说一件最近工作中遇到的问题。我在前端使用 ajax 请求数据,接下去的事情需要等待这些数据到达后才能继续。

当时心中出现了好多问题:JavaScript 作为一个单线程语言,是如何实现 ajax 的异步调用的?这些跟线程有关系吗?有没有方法保证异步调用的顺序执行?

回过头来细想,能提出这些问题,都是因为我当时看过了操作系统是如何处理并发的,如何处理线程的。这些问题自然地出现在我的思考过程中。

顺着这个思路,很顺利地找到了 JavaScript 中异步编程的方法 promise,async、await。

*这里推荐一下我翻译的一篇文章:可视化的 JavaScript Promises & Async/Await (https://zhuanlan.zhihu.com/p/467601693)

88d72267c5c5a7069f88a581cb8cc9a2.gif

其实,在很多高级的编程语言中都有异步编程。比如 JavaScript 中的 promise,async、await;C# 中的 async、await、Task 等等。

我个人的体验是这样的,如果只是为了掌握语言的特性,学习异步编程很有可能会学得雨里雾里。但是,当我们知道了操作系统是如何处理并发的,如何处理线程的,这些知识都将会帮助我们更加深刻地理解编程语言中的异步问题。

最后,还是回到文章开头那句话 —— 一切都从底层逻辑开始。

(完)

点击下方图片,查看更多精彩

1b07b290afee87325bb6cc00b8c4d7c0.png

f445f4750456e824bfe6d67f8d89b8a7.png

b1548f418a39c45666d4616ea15a2f61.png

6044ccc8d1da04b3b79c8b9ac75cbef3.png

2fdebf0d9e2ca24d359ae621b97cebec.png

扔掉单词书也能搞定四六级词汇 这条曲线告诉我们遗忘是有规律的,遗忘的进程不是均衡的,在记忆的最初阶段遗忘的速度很快,后来就逐渐减慢了,到了相当长的时候后,几乎就不再遗忘了。大家一定要掌握好自己的遗忘临界点,我以前是第一天背过的单词,第二天复习,然后再开始背新的记得就比较牢的。光背单词的效果不大,容易忘记,而且有时候明明知道的单词,听的时候又不知道是哪了。学的还算可以,每次学新的单词的时候注意对应的字母的音标发音,然后跟老师读正确的发音,这样不管是谁读的,只要你熟悉单词的发音,个一组,背一组,测试自己一组,背会了再背下一组。 阅读详情

相关推荐

早上A第一个醒来,扔掉一条鱼后,剩下的鱼正好均分成五份,A拿走自己的一份;B第二个醒来,扔掉一条鱼后,也将鱼均分为五份,B拿走自己的一份。CDE依次醒来,也按同样的方法拿鱼,问他们合伙捕了几条鱼。

早上A第一个醒来,扔掉一条鱼后,剩下的鱼正好均分成五份,A拿走自己的一份;B第二个醒来,扔掉一条鱼后,也将鱼均分为五份,B拿走自己的一份。CDE依次醒来,也按同样的方法拿鱼,问他们合伙捕了几条鱼。其中,鱼的数目>=100,要求输入捕鱼数目的范围,根据输入的鱼的数目范围,计算捕多少鱼才能满足上述分鱼规则。若干行,每行一个整数,表示在输入范围内,满足分鱼规则的捕鱼数目。[提交] [状态] [讨论版] [命题人:hexl]一行,一个整数n,表示整数100~n之间的范围。提交: 1764 解决: 1208。

qq_44167426的博客 1650

【饭谈】扔掉心中的拐杖吧~

于是,在一次班会的时候,我尴尬的戴着耳机唱完了一首歌曲,结果逗得同学们哄堂大笑,当时我还不知道什么情况,直到我看了一遍同桌给我的录像…就这样,直到有一次手机没电了,耳机早已没有了声音,而我还在维持一个稳定的程度:起码自己听到自己唱的不觉得难听,甚至还能起到共情和热血的程度。然后在之后的班会时,我再次唱了同一首,这次唱完后,全场鸦雀无声,也没有了之前的哄堂大笑,取而代之的是热烈的掌声…也是从那次,我明白了这个道理,听再多遍也不会让自己唱的好,要想唱得好,只能扔掉耳机,独立的去练歌。

我去热饭的博客 430

【虚拟化生态平台】虚拟化平台esxi挂载USB硬盘

虚拟化平台安装好之后,一般情况下,只有一个硬盘在工作,其他的外接硬盘(我的只有一个ssd硬盘,其他的均是usb外接,SATA接口的硬盘是否这样我暂时不清楚哈)没有在工作,但是一个硬盘明显不够我们使用的,所以我们需要去挂载外接的硬盘来扩容。...

Rubik Blog 4835

撕书记忆法

郑昀 20090717     我不爱记东西。即使是高中时语文课惊悚片似的随机点名背古文,也没办法逼我事先把课文背会。在大学里,我对待微积分、数理方程和材料力学等需要特定公式解题的课程仍是这个态度,所以屡屡上演了在考场上从头推理各种公式的一幕幕,还好,我一向对定理定律理解得比较深刻,倒也能屡屡成功过关。     但从某时开始,我发现不经意之间能深深地记住很多细节。    比如说,开会,尤其是...

weixin_34280237的博客 336

【LTspice】005 伯德图绘制

目录 1 伯德图介绍 2 LTspice 截止频率验证 3 LTspice中如何添加光标 4 LTspice中如何将 幅频 和 相频曲线分开 1 伯德图介绍 Bode图由对数幅频特性和对数相频特性两张图组成。伯德图_百度百科 (1)对数幅频特性曲线 对数幅频特性是频率特性的对数值L(ω)=20lgA (ω)(dB)与频率ω的关系曲线;对数幅频特性的纵轴采用线性分度,为幅值的分贝数,即 L(ω)=20lgA(ω),A(ω)每增加10倍,L(ω)增加20dB;横坐标采用对数分度,即横轴上的ω取

m0_59642765的博客 1万+

LangGraph实战:用Plan-and-Execute模式5步搭建智能问答机器人(附Tavily搜索集成)

本文详细介绍了如何利用LangGraph的Plan-and-Execute模式,通过规划、执行、动态调整三个核心阶段,构建一个能够处理复杂多步骤问题的智能问答机器人。文章提供了从环境配置、状态管理到核心节点(规划、执行、重新规划)实现的完整实战指南,并集成了Tavily搜索工具,展示了如何将智能任务规划应用于实际信息查询场景。

weixin_29258297的博客 343

扔掉你的鼠标

摘要:推荐两款 Windows 佳软,远离鼠标,节省时间提升效率。这里是「每周分享」的第 21 期。往期分享内容可以在公众号后台的 「不务正业」菜单中找到,Python ...

苏克的博客 258

GPU微架构演进分析--从SIMT到Scalar-Vector-Tensor计算的混合配比与调度

GPU架构经历了从专用计算模块到统一可编程处理器的演进。传统GPU面临专用电路配比难题,Nvidia Tesla架构通过引入可编程多线程处理器实现图形与计算的统一。Fermi架构进一步向计算倾斜,随后的架构陆续加入Tensor Core等专用单元。AI时代促成了从图形处理主导向AI计算的转变,形成了Scalar+Vector+Tensor的混合计算范式。SIMT调度重要性降低,CUDA面临新挑战,RISC-V等架构可能带来新机遇。

ChipCamp的博客---https://chipcamp.blog.youkuaiyun.com/ 917

扔旧被子扔掉霉运_您应该扔掉所有高科技产品盒吗?

扔旧被子扔掉霉运The packaging that all of your fancy toys came inis no longer just packaging—it’s a part of the product, and many argue that keeping boxes and other packaging can help yousell the item in th...

culintai3473的博客 2517

保姆级教程:用OpenCV搞定鱼眼双目相机的标定与测距(附完整C++代码)

本文详细介绍了使用OpenCV进行鱼眼双目相机标定与测距的全流程,包括环境搭建、数据采集、单目标定、双目标定、立体校正和视差计算等核心步骤。通过完整的C++代码示例和参数调优指南,帮助开发者快速实现高精度的双目测距系统,适用于机器人导航、VR全景拍摄等领域。

weixin_42573113的博客 389

UA MATH567 高维统计I 概率不等式1 Hoeffding不等式与Chernoff不等式

UA MATH567 高维统计I 概率不等式1 Hoeffding不等式与Chernoff不等式 这个系列介绍高维统计,一些需要知道的结论可以参考UA MATH 564与566两个系列,分为两大部分,高维的概率论相关结果、高维的统计模型。概率论相关结论分六个部分介绍:概率不等式、高维随机向量、随机矩阵、Concentration without Independence、二次型、随机过程。 ...

一个不愿透露姓名的博客 2734

还不如扔掉

周六、周日打算搬回学校的单身宿舍了,把租的房子退掉,但是屋子里却有一些东西,很难处理,主要是一些“家具”,两张电脑桌、3把椅子、两个写字台、一个组合的柜子。 这些东西怎么处理呢?一个方式是送人,可是没人要,另外一个方式是运到家里,但是总觉得不太值,这些东西家里也用不上,最后决定半卖、半送、半扔,可能这就是一个很简单的处理方式。 但是在维护系统的时候,我们总是尽可能的增加功能,而不是将没有用的功能扔...

duiker 159

基于STM32设计的遥控小车(手机APP+GPS+温湿度+ESP8266)

一、环境介绍 小车主控MCU: STM32F103ZET6 STM32程序开发IDE: keil5 STM32程序风格: 采用寄存器方式开发,注释齐全,执行效率高,方便移植 手机APP: 采用QT设计,程序支持跨平台编译运行(Android、IOS、Windows、Linux都可以编译运行,对应平台上QT的环境搭建,之前博客已经发了文章讲解) 硬件包含: 淘宝购买的完整一套4轮遥控小车(采用STM32F103ZET6作为主控板)、DHT11温湿度传感器、中科微GPS模块、ESP8266 ...

6万+

【常常被我们扔掉了的营养】

【常常被我们扔掉了的营养】①扔掉抗癌物质:茄子、萝卜、苹果、红薯、番茄的皮;②扔掉的维生素:莴笋的叶子、白菜的老叶;③扔掉的胶原蛋白:鸡鸭的皮,鱼鳞;④扔到的美容强身好宝贝:骨头、骨髓、软骨;⑤扔掉的最为营养的部分:豆芽的两头、青椒生籽的白色海绵部分、冬瓜白色芯部。

u013802666的专栏 316

【国产MCU】-CH32V307-通用定时器(GPTM)-输入捕获模式测量脉冲

CH32V307的通用定时器模块包含一个16 位可自动重装的定时器(TIM2、TIM3、TIM4和TIM5),用于测量脉冲宽度或者产生特定频率的脉冲、PWM波等。可用于自动化控制、电源等领域。 输入捕获是通用定时器功能之一,一般用于测量频率和测量脉冲宽度。本文将详细介绍如何通用定时器的输入捕获功能。

视觉与物联智能 2816

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

“一定把你的代码初稿,全部扔掉!”

编译 | 郑丽媛出品 | 优快云(ID:优快云news)当软件团队要开始一个重大项目的时候,通常流程是以下这样的:(1)产品经理与工程团队开会,提出下一个主要功能的描述,其中可能包括验收标准,也会有不同保真度的设计。(2)然后,团队中的一名工程师会负责这项功能,将其分解为更小的任务并进行分工。他们将高级功能描述,转化为完成该功能所需完成的所有工作的完整列表。(3)由于复杂性未知或需要进行更多调...

优快云资讯 8379

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关于《编程高手箴言》一书

      今天在图书馆看见这本书,被它的第一章《程序点滴》所吸引了,便拿过来读了一个下午。郑渊洁说过这样一句话“一本书不管从哪页看起,5分钟后还不能吸引你,请毫不犹豫地扔掉它。”我的确被第一章所吸引了。      书的作者是梁肇新,他是豪杰公司的董事长兼首席程序员。既能坐的管理层第一把交椅,又能坐的技术员第一把交椅,必然有一番实力。      只是书中有一处,第252页中写道: 

Rolin的专栏 1628

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

书之累

昨天整理屋子,发觉已经堆了很多书,包括尽两年的《程序员》和半年多的《开发高手》。杂志开本很大,以前的非彩页的比较厚,堆起来有好高似的。mm叫我仍了或者卖了,自己舍不得啊,里面有好多文章现在看起来还不错,以前因为没接触到,有很多只是粗略的翻一下。可惜不是没时间就是没精神和精力,最多就是方便的时候再翻翻。 《开发高手》毕竟还是差了许多,不但纸质差多了竟还有很多错别字,有些词句

侵晨。乐趣生活 986

是时候扔掉你的密码了

人工智能程序通过数千万个泄露的密码,不断学习生成密码的规则,最后将人工智能程序生成的用户密码,跟未泄露密码的账户进行密码正确性测试。正如密码史学家乔尔·里维尔所说,密码,作为信息的保护工具,已经存在了数千年。用户行为对于密码的安全性影响极大,很多人都有类似的习惯,各类网站使用同一个密码,或者将密码书写在纸质或电子的备忘录上,这类习惯都会导致安全风险的增加。Single Sign-On是一个有力的密码管理工具,它简化了用户体验,提高了安全性,减轻了组织的支持成本,同时也有助于降低密码相关的风险。

2401_84466223的博客 624

记住这些,你的鼠标就可以扔掉了

记住这些,你的鼠标就可以扔掉了。 F1           显示当前程序或者windows的帮助内容。 F2           当你选中一个文件的话,这意味着“重命名” F3           当你在桌面上的时候是打开“查找:所有文件” 对话框 F10或ALT        激活当前程序的菜单栏 windows键或CTRL+ESC   打开开始菜单 CTRL+ALT+D...

anjichan4261的博客 201

0011(3 的补码) + 1101(-3 的补码)= 10000(二进制) ,到底为什么最左边多出来的1要扔掉?

计算机里的二进制位数是固定的(比如这里的4位),就像“固定大小的篮子”。当加法结果超出这个位数时,多出来的最高位(最左边的1)是“溢出”的数,而补码的设计刚好让“溢出的1”代表“完整的一轮计数”(比如4位二进制里,16刚好是一轮),扔掉它之后,剩下的数就是正确结果。就像你用钟表计时:3点加9小时是12点,12点在钟表上会变成0点(扔掉“12”这个溢出的数),和这里“扔掉最左边的1”是一个道理~(就像题目里的“4个灯泡”——4位二进制),篮子最多只能放下4个苹果,多出来的必须扔掉。

长风破浪会有时的博客 351

首尔国立大学:AI读完“书“就扔掉笔记,竟比一直抄笔记更聪明?

首尔国立大学:AI读完"书"就扔掉笔记,竟比一直抄笔记更聪明?

weixin_49122920的博客 309

一个孤独的流浪汉

朋友要搬家了,我的东西还放在他那,因为换工作,我也换地方住了,但是一些暂时用不着的东西就放在那了。早上我很早就起来了,6点起来,吃完饭就去五角场那边,从七宝到五角场需要花费2个小时左右。当我8:30到了那的时候,给他打手机,竟然是关机的,我就去以前常去的那个网吧,直到他开机后看到我的短信。10点多,我把东西从房间搬了出来,然后想找个三轮车拉到在国权北路的表姐那去,我先电话给哥,他说那有三轮车,我就

♨Joe的专栏 1192
上一篇: 我要中年危机了,程序员失业来的太突然了!
下一篇: 漫画 | JavaScript杀死了编程......
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值