文档章节

这才是你需要的C语言、C++学习路线!

CodeSheep
 CodeSheep
发布于 02/29 09:27
字数 2383
阅读 3.5W
收藏 142

小伙伴们,大家好。

关于C语言和C++的学习路线终于梳理完了。当然我也只能从我曾经近3年的通信公司后台开发经历和目之所及的世界,跟大家聊聊这个话题。

这块的东西很多很杂,不过梳理和总结之后,回过头来看,其实学习思路、学习路线应该还是比较清晰的。由于个人认知有限,不足的地方也欢迎大家评论里补充。


先聊几个有趣的问题

这几个问题都是私信里常被问到的,也是我当时学习过程中的一些疑惑。

问: 为啥我学完了C语言或者C++,却还是啥东西也做不出来?

答: 编程语言学完了就能做出东西那也真是天才哇!应该说语言学得就算再精通,它其实也只代表完成了“最小的”那一部分,和实际上手干活之间还是有一个非常大的鸿沟,这个鸿沟就表现为下文即将详述的 编程基础四大件 + 应用实践编程

问: 为什么C/C++写出来的东西都是运行于黑乎乎的命令行?这玩意真有用吗?

答: 嘿嘿,谁说黑乎乎的命令行里运行的程序就没有用!咱大名鼎鼎的Linux系统都以命令行跟用户交互呢,而且Linux里面很多强大的工具都是运行于黑乎乎的命令行!

问: 从技术学习和实际运用的角度来看,C/C++和Java到底区别在哪?

答: C/C++,它和Java确实不太一样。C语言和C++,尤其C++,语言粒度细、机制多,性能虽然高,但语言本身的包袱也确实重,我们更愿意称它“造轮子”的语言!也正是因为C语言和C++性能好、粒度细,所以什么都能做。而Java本身就是一种服务于互联网软件开发(后端开发+客户端开发)的语言,它有一个明显的“生态圈”的概念,所以应用领域非常清晰。我个人觉得C语言和C++编程比Java还是要难一些,Java毕竟是纯应用层的,C语言和C++则对程序员能力的要求要更高一些。


岗位分析

了解一下岗位,知道以后能做什么,这个也有利于自己树立学习目标。

C语言和C++属于“造轮子”语言,几乎什么都能做。不过一般来说,C语言和C++主要还是做后台(服务端)开发比较多,包括:

  • 通信公司后台开发
  • 互联网公司后台开发
  • 游戏公司后台开发
  • ……

当然这个后台开发具体职责又有很多细分,比如:

  • 有做数据处理和分析的
  • 有做基础协议和通信的
  • 有做服务端底层应用优化的
  • 甚至还有做后台系统驱动和内核的
  • ……

不管怎样,下面即将要介绍的这些学习路线和内容适用于以上所有情况。所以呢,下面就来讲讲具体的学习路线。


语言本身的学习

C语言:

  • 除了最最基础的语法:变量、条件、循环、字符串、数组、函数、结构体等之外
  • C语言最最最最最重要的那就是:指针、内存管理,以后企业里开发就靠它俩吃饭,这也是检验C语言掌握情况的两大标准

推荐书籍:《C Primer Plus》、《C和指针》、《C专家编程》

C++:

  • C++和C语言确实是不同的语言,但是C++确实是对C语言的延伸,可以理解为在C语言里加入了面向对象的特性。因为只有面向对象特性的加持,代码才能更好的复用扩展工程化,这是大型项目的必备要素
  • 除了C语言所有的底子之外,还需要学习C++的面向对象(封装、继承与多态)特性、泛型、模板、STL等等

推荐书籍(有先后顺序):《C++ Primer》、《Effective C++》、《C++ 标准程序库》、《STL源码剖析》《深度探索C++对象模型》

最后一个小建议是:语言部分的学习建议不要拖太久,一定要规划好时间,一鼓作气,高强度给它压下来,否则容易把自己搞泄气。


编程基础四大件

基础四大件包括:数据结构和算法计算机网络操作系统设计模式

这跟学什么编程语言、后续从事什么编程方向均无关,只要做编程开发,这四个计算机基础就无法避开。可以这么说,这基础四大件真的比编程语言重要!!!

1、数据结构和算法

可以说这个直接决定了面试的成败!几种基础数据结构类型得烂熟于心,比如:字符串、链表、二叉树、堆、栈、队列、哈希等;基本的几大算法也要了如指掌,比如查找、排序、动态规划、分治等等。

建议LeetCode多刷题。

参考资料: 《大话数据结构》、《算法》、《剑指offer》《LeetCode刷题》

2、计算机网络

此处的计算机网络指的就是TCP/IP协议栈,可以说它是当下互联网通信的基石,无论如何一定要对TCP/IP的协议栈了如指掌,主要就是学习和掌握原理,包括:ARP协议、IP协议、ICMP协议、TCP和UDP协议、DNS协议、HTTP协议、HTTPS协议

推荐书籍: 《TCP/IP详解》

3、操作系统

该部分重点包括:进程和线程的相关原理(原子性、并发、锁)、内存相关原理(内存分布、内存调度)

推荐书籍:《深入理解计算机系统》

4、设计模式

倒不需要23种设计模式全部记住,常见的几个如:单例模式、工厂模式、代理模式、策略模式、模板方法模式建议熟练于心。

推荐书籍:《大话设计模式》、《设计模式之禅》


应用实践编程

这部分会涉及到一些工具、编程环境、和具体编程实践,应该说这一部分学完,自己应该能做点东西出来、或者说能看懂一些实际项目的代码。

实践这部分,我也是结合我之前在通信公司的实际工作经历和所听所见,来聊一聊。

1、Linux操作系统的使用

很多人初学C语言、C++(包括我)都是在Windows环境上进行的,而实际企业级开发几乎不可能,所以Linux系统必须要会,我们别无选择。先谈使用。

包括:常见的Linux操作命令基本的Shell编程

推荐书籍:《鸟哥的Linux私房菜》

2、编译/调试工具

首先是跟编译相关的:编译工具!

我们知道很多人学C语言、C++都在类似Visual Studio这种集成IDE里进行代码编译,这个其实也用了编译器,只不过是微软自家的MS编译器,而且所有操作均可视化。而企业里开发很少会基于Windows系统,所以Linux平台上的编译器更为重要,最典型的当属GCC,甚至有些公司有自己定制过的交叉编译工具,但没关系,只要GCC熟悉,其他问题都不大。

其次,大家自学C语言、C++,都借助类似VS这种IDE,点按钮即可对源文件编译。而企业里实际项目的编译动作叫make,编译的实际动作和过程都是写在makefile文件里,所以makefile的书写规则建议学习!

最后说到调试,Linux平台上的GDB调试工具要熟练使用,会借助于它进行调试。

推荐资料: 这部分没有书可推荐,英文好的同学可以直接看GNU官网关于GCCGDB的文档,中文材料可以看:《debuging with gdb》(中文版)和陈皓先生的《跟我一起写makefile》

3、Linux环境编程

还是那句话,企业里C语言和C++几乎都是基于Linux平台的,这一部分我们没办法避开

(1)Linux系统编程

众所周知,Windows系统编程里有各种各样的Windows API,同理Linux系统API的使用就更加重要。

(2)多线程编程

此处指的是多线程编程实践相关的东西,一般包括:线程、资源、信号、同步、互斥、锁等等一些具体的编程方法。

(3)网络编程

此处的网络编程主要指的是具体Linux系统上的网络编程APIIO函数的编程实践。

推荐书籍:这三部分综合在一起,推荐必看书籍包括《Unix环境高级编程》、《Linux高性能服务器编程》、《POSIX多线程程序设计》


每天进步一点点,Peace!

© 著作权归作者所有

CodeSheep

CodeSheep

粉丝 293
博文 82
码字总数 117942
作品 0
南京
程序员
私信 提问
加载中

评论(13)

mskk
mskk
推荐一本书,unix-linix编程实践教程
l
lbfamous
现在的C++还能找什么工作呢。。。
a
alex
IM 类应用,底层协议,还是很多 c++ 的;
l
lbfamous
除了这些还有么
st_lein
st_lein
高性能服务器应用开发,大型游戏开发,各种底层系统开发
J
Johnyxc
去看下鹅厂的TOP5语言
ruhejixu
ruhejixu
👍写的很好
开源中国首席罗纳尔多
开源中国首席罗纳尔多
您好,请问c写的linux内核,是怎么写的,怎么可以和cpu通讯?
UchihaRyuuzaki
UchihaRyuuzaki
cpu是个发动机,它并不能带你去哪里,只知道无休止地运转,内核则是汽车,一套利用和控制发动机的器械。
捍卫机密
捍卫机密
简单来说,每个硬件都会在内存里面映射一段地址,控制硬件就是按照规则在这些地址上读写数据。
羽名
每种cpu有些许不同,但大致都一样。 1,硬件中断。 2,软件中断。 3,万物基于文件。 1大致上是基于平台特性,桌面x86 pc基本都是ibm兼容机,所以没什么区别。而arm就不同了,找kernel源码看看。 2是依赖内核初始化时,操作,主要是提供给应用层,一些获得或写入底层的api。当然,这种可以用io映射(意思就是往固定地址写入或读取数据,能操控硬件),但不推荐。毕竟这样,有时候会让应用层的权限很高。 3才是重点,基本初始化内核时,会把驱动挂载到内存中,然后把文件映射到该驱动。 你可以读取下列 /sys/driver,可以找到所有内核驱动信息,包括android /sys/device,设备信息 余下的,我忘记了 如果你真心想学习linux,你可以利用qemu+vscode来调试arm linux内核,很简单的。几乎不需要任何依赖,就可以编译arm kernel。
薛某某
薛某某
B站,公众号,现在又追到开源中国啦~程序羊最棒!
c
cfitsi
谢谢整理了,这讲得比较实在,一起学习加油
C++小结--第一个简单的程序

1 C++简介 C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对...

静静流淌的柯溪
昨天
0
0
牛逼的C/C++程序员是如何练成的?

这个题目的噱头太大,要真的写起来, 足够写一本书了。 牛耳人分享一些经验,希望能让初学的小伙伴少走弯路。 每个人的情况不一样,所以下面的描述可能并不适合每一个看到这篇文章的人。 一、...

weixin_42743471
2018/12/07
0
0
大神告诉你学好这几点,你就学会了C语言

很多小伙伴在初学C语言的时候完全没有什么概念,完全不知道怎么去学怎样才能掌握这门语言的重要知识点。 今天小编就来总结一下学习C语言过程中四大重点吧 ! (一)C语言要学到什么程度才算差...

诸葛玥
2018/05/25
0
0
C语言/C++编程基础入门学习重要知识之i++和++i的区别

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/03/17
0
0
如何自学成为C/C++程序员大牛

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux常用命令08 - curl

curl 是一个命令行实用程序,用于将数据从服务器或传输到服务器,该服务器设计用于在没有用户交互的情况下工作。 使用 curl,您可以使用支持的协议(包括 HTTP、 HTTPS、 SCP、 SFTP 和 FTP)...

叉叉敌
17分钟前
17
0
java8 map根据key排序和根据value排序

1、根据key排序 Map<String,String> result = new LinkedHashMap<>();Map<String,String> map = new HashMap<>(); map.entrySet().stream()    .sorted(Map.Entry.comparingByKey......

文文1
17分钟前
13
0
scrapy爬取word转换HTML页面 出现中文乱码

def parse(self, response): print('========== parse ==========') print(response.text[:100]) body = response.body encodings = ['utf-8', 'gbk', 'gb2312', 'iso-8859-1', 'latin1'] fo......

driverxb
24分钟前
13
0
JavaScript模块化-CommonJS、AMD、CMD、UMD、ES6

前言:模块化开发需求 在JS早期,使用script标签引入JS,会造成以下问题: 加载的时候阻塞网页渲染,引入JS越多,阻塞时间越长。 容易污染全局变量。 js文件存在依赖关系,加载必须有顺序。项...

胡哥有话说
27分钟前
12
0
京东商城背后的AI技术能力揭秘 - 基于关键词自动生成摘要

作者:京东AI研究院 导言 过去几十年间,人类的计算能力获得了巨大提升;随着数据不断积累,算法日益先进,我们已经步入了人工智能时代。确实,人工智能概念很难理解,技术更是了不起,背后的...

京东智联云开发者
35分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部