[编程开发] 为什么说 C++ 是最难学的编程语言?

[复制链接]
冰点精灵 发表于 2023-10-13 01:11:38|来自:北京 | 显示全部楼层 |阅读模式
为什么说 C++ 是最难学的编程语言?
全部回复5 显示全部楼层
bebe861011 发表于 2023-10-13 01:12:29|来自:北京 | 显示全部楼层
当一个项目被评估为要用C++写的时候,往往代表着这个项目在高实时性要求、低硬件资源、重度计算、古董环境没别的语言用里面至少沾一个。毕竟能用OpenCV-Python没人喜欢用OpenCV,能MATLAB解决也没人想用 CUDA C++。这些需要用C++的项目难度本来就比写个GUI搞个互联网难很多,自然给人感觉是C++难。至于某圆姓java吹答主,当初人家觉着性能不重要把我拉黑的时候互联网比电子信息就业好很多,可惜今年嵌入式已经开始培训班爆满了,看他脸肿之前还能胖几年
ybhl 发表于 2023-10-13 01:13:13|来自:北京 | 显示全部楼层
C++难就难在:在C++中你找不到任何一件简单的事。
知友自我嘲笑C++经典语录:
1个月: 都说C++难,但聪明如我,一个月就读完了C++ primer,我看这C++也不过如此.
3个月: 原来之前一直在用C++语法写C... 开始正式学习C++...
1年: 今天花一下午一定要琢磨明白这段代码啥意思...
2年: C++太他妈难了, 发明C++的可以吃X去了
3年: 这辈子绝对不能继续搞C++了,珍惜生命,远离C++
4年: ......
5年: 终于神功初成, 大家好,我是C++专家,疑难杂症请问我
7年: 我比较擅长XXX这块,其他方面我是外行
10年: 我有一定的C++基础...
对于多数初学者来说,C++ 的难度并不在语法语意等语言层面,而是没学过 C++ 所支持的面向对象、泛型编程、元编程、函数式编程等不同编程范式,以至于标准模板库(STL)里关于数据结构和算法的知识,甚至一些部分与计算机架构、编译原理、操作系统等知识相关。学习 C++ 可以同时学习、实践这些相关知识。
有人把C++和物理作类比。我很同意。理论物理是一场无尽的旅程,总有最前沿的东西。我对神经科学很感兴趣,也有幸与一个神经科学相关专业的学生交流过,她还给我发过资料,我很感激。然而我在知乎上看到过一个相关的讨论。一个人说“我小时候就想知道大脑是如何工作的,于是我学了神经科学,如今我已经是神经科学博士,依然不知道大脑是如何工作的”。所以我的求知欲只能暂且到此为止。C++亦是如此。
扯远了,我们来说C++有多难吧。
我们只谈构造函数。假如我们有一个类Teacher。
class Teacher
{
private:
    std::string name;
    std::string position;
};
我们考虑给Teacher类加上构造函数。
class Teacher
{
private:
    std::string name;
    std::string position;

public:
    Teacher(const std::string& n, const std::string& p)
        : name(n), position(p) {}
};
虽然语义正确,但是如果我们的实参只为了传递给Teacher,传递之后而没有其他作用的话,那么这个实现是效率低下的。字符串的拷贝花销可观(关于std::string的COW,SSO,view的讨论是另一个故事了)。我们在C++11里面有右值引用move语义,所以呢,我们可以改成这样。
class Teacher
{
private:
    std::string name;
    std::string position;

public:
    Teacher(const std::string& n, const std::string& p)
        : name(n), position(p) {}

    Teacher(std::string&& n, std::string&& p)
        : name(std::move(n)), position(std::move(p)) {};
};
你可能觉得这样也已经不错了。不过我们还有可能第一个参数右值,第二个参数左值。或者第一个参数左值,第二个参数右值。所以实际上我们需要四个函数的重载。
class Teacher
{
private:
    std::string name;
    std::string position;

public:
    Teacher(const std::string& n, const std::string& p)
        : name(n), position(p) {}

    Teacher(std::string&& n, std::string&& p)
        : name(std::move(n)), position(std::move(p)) {};

    Teacher(const std::string&& n, const std::string& p)
        : name(std::move(n)), position(p) {}

    Teacher(const std::string& n, const std::string&& p)
        : name(n), position(std::move(p)) {}
};
代码有点多。我们有没有什么方法写一个通用的函数来实现这四个函数呢?有。我们在C++11中有完美转发
class Teacher
{
private:
    std::string name;
    std::string position;

public:
    template <typename S1, typename S2>
    Teacher(S1&& n, S2&& p)
        : name(std::forward<S1>(n)), position(std::forward<S2>(p)) {};
};
完成了。美滋滋。然而事情没有这么简单。如果我们的position有默认值,然后我们写如下代码的话。
class Teacher
{
private:
    std::string name;
    std::string position;

public:
    template <typename S1, typename S2 = std::string>
    Teacher(S1&& n, S2&& p = "lecturer")
        : name(std::forward<S1>(n)), position(std::forward<S2>(p)) {};
};


int main()
{
    Teacher t1 = { "david", "assistant" };
    Teacher t2{ t1 };
}我们出现了编译期错误。因为Teacher t2{ t1 };的重载决议的最佳匹配是我们的模板,而不是默认的拷贝构造函数,因为拷贝构造函数要求t1是const的。所以,我们可能需要SFINAEtype traits来修改我们的代码。注意,默认函数参数不能类型推导,所以我们才需要的S2的默认模板参数。
class Teacher
{
private:
    std::string name;
    std::string position;

public:
    template <typename S1, typename S2 = std::string,
    typename = std::enable_if_t<!std::is_same_v<S1, Teacher>>>
    Teacher(S1&& n, S2&& p = "lecturer")
        : name(std::forward<S1>(n)), position(std::forward<S2>(p)) {};
};
仍然不对哦,因为我们的完美转发有引用折叠机制,我们应该判断的S1是Teacher&而不是Teacher。其次,如果有类继承我们的Teacher的话,拷贝的时候依然会出现这个问题,所以我们需要的不是is_same而是is_convertible。然而,如果我们直接写std::is_convertible_v<S1, Teacher>的话,我们实际上判定是不是可以转换的时候,还是会去看我们的构造函数。也就是说我们自己依赖了自己,无穷递归。所以我们需要的是std::is_convertible_v<S1, std::string>。所以,我们修改我们的代码。
class Teacher
{
private:
    std::string name;
    std::string position;

public:
    template <typename S1, typename S2 = std::string,
    typename = std::enable_if_t<std::is_convertible_v<S1, std::string>>>
    Teacher(S1&& n, S2&& p = "lecturer")
        : name(std::forward<S1>(n)), position(std::forward<S2>(p)) {};
};
其次,因为我们的默认参数是字面量,字面量是const char[]类型的。我们调用构造函数的时候,也会用字面量。字面量不是std::string类型会造成很多问题。然而在C++14中,我们可以用User-defined literals来把字面量声明成std::string类型的。不过记得命名空间,这个名字空间不在std中。我们这里不再讨论了。
我们接下来讨论用构造函数初始化的问题。初始化有很多种写法,以下我列出有限的几种。
Teacher t1("david"s);
Teacher t2 = Teacher("david"s);

Teacher t3{ "lily"s };
Teacher t4 = { "lily"s };
Teacher t5 = Teacher{ "lily"s };

auto t6 = Teacher("david"s);
auto t7 = Teacher{ "lily"s };
我们用了auto。然而auto是decay的。而decltype(auto)不。所以,以下代码如果用auto的话可能不是你需要的。
const Teacher& t8 = t1;
auto t10 = t8;我们需要写const auto&。
此外,我们可以看出,用小括号和大括号好像没什么区别。不过,在一些情况下会有很大的差别。我们列出一些。
std::vector<int> vec1(30, 5); std::vector<int> vec2{ 30, 5 };甚至因为C++17的构造函数自动推导,我们可以写出更加疯狂的代码。
std::vector vec3{ vec1.begin(), vec2.end() };这个代码是用初始化列表初始化的,也就是说我们得到的vec3中有两个iterator。
好了,我们回过头来说auto。我们可以看到好像我们所有的初始化都可以用auto。是这样吗?如果我们写atomic的代码呢?
auto x = std::atomic<int>{ 10 };是可以的。因为在C++17中我们有Copy Elision。所以这里没有拷贝函数的调用,和直接定义并初始化是一致的。但是atomic初始化是有问题的。
std::atomic<int> x{};这样是不能零初始化的。当然了,这显然是API的不一致,或者说错误。所以我们有LWG issue 2334。预计在C++20修复这个问题。嘻嘻。
以上内容基于《C++ templates》的作者Nicolai Josuttis的几场talk。
作者:琉璃
链接:https://www.zhihu.com/question/30196513/answer/563560938
来源:知乎
这里详细谈下C++ 的学习路线,按照这个路线去学习C++,每个阶段都帮你规划好了学习时间,只要你努力且认真的去学了, 保证帮你既高效又扎实的学好C++:

一、C++基础(3个月)

1、面向对象的三大特性:封装、继承、多态
2、类的访问权限:private、protected、public
3、类的构造函数、析构函数、赋值函数、拷贝函数
4、移动构造函数与拷贝构造函数对比
5、深拷贝与浅拷贝的区别
6、空类有哪些函数?空类的大小?
7、内存分区:全局区、堆区、栈区、常量区、代码区
8、C++与C的区别
9、struct与class的区别
10、struct内存对齐
11、new/delete与malloc/free的区别
12、内存泄露的情况
13、sizeof与strlen对比
14、指针与引用的区别
15、野指针产生与避免
16、多态:动态多态、静态多态
17、虚函数实现动态多态的原理、虚函数与纯虚函数的区别
18、继承时,父类的析构函数是否为虚函数?构造函数能不能为虚函数?为什么?
19、静态多态:重写、重载、模板
20、static关键字:修饰局部变量、全局变量、类中成员变量、类中成员函数
21、const关键字:修饰变量、指针、类对象、类中成员函数
22、extern关键字:修饰全局变量
23、volatile关键字:避免编译器指令优化
24、四种类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
25、右值引用
26、std::move函数
27、四种智能指针及底层实现:auto_ptr、unique_ptr、shared_ptr、weak_ptr
28、shared_ptr中的循环引用怎么解决?(weak_ptr)
29、vector与list比较
30、vector迭代器失效的情况
31、map与unordered_map对比
32、set与unordered_set对比
33、STL容器空间配置器
参考书籍:《C++ Primer》(第5版)、《STL源码剖析》、《深度探索C++对象模型》
下载地址:

  • 链接:https://pan.baidu.com/s/1qqAR6iqjur1sfmzeZjcrwg
  • 提取码:m6gx
  • 戳下面获取面试真题:
大厂15万字C++开发面试手册出炉(C++和计算机基础全有)​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487041&idx=1&sn=1c49fe6e12b1e52f66462b8b942e1644&chksm=fdb3f09fcac47989e399f52a975a6d2b18bd15e8cdfe720e3d878866f2d05c758318e2f6241f#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487041&idx=1&sn=1c49fe6e12b1e52f66462b8b942e1644&chksm=fdb3f09fcac47989e399f52a975a6d2b18bd15e8cdfe720e3d878866f2d05c758318e2f6241f#rd二、计算机网络(1个月)

1、OSI7层网络模型:应用层、表示层、会话层、运输层、网络层、链路层、物理层
2、TCP/IP四层网络模型:应用层、运输层、网际层、接口层
综合OSI与TCP/IP模型,学习五层网络模型:
从上向下架构:应用层、运输层、网络层、链路层、物理层
链路层:
3、MTU
4、MAC地址
网络层:
5、地址解析协议
6、为啥有IP地址还需要MAC地址?同理,为啥有了MAC地址还需要IP地址?
7、网络层转发数据报的流程
8、子网划分、子网掩码
9、网络控制报文协议ICMP
10、ICMP应用举例:PING、traceroute
运输层:
11、TCP与UDP的区别及应用场景
12、TCP首部报文格式(SYN、ACK、FIN、RST必须知道)
13、TCP滑动窗口原理
14、TCP超时重传时间选择
15、TCP流程控制
16、TCP拥塞控制(一定要弄清楚与流量控制的区别)
17、TCP三次握手及状态变化。为啥不是两次握手?
18、TCP四次挥手及状态变化。为啥不是三次挥手?
19、TCP连接释放中TIME_WAIT状态的作用
20、SYN泛洪攻击。如何解决?
21、TCP粘包
22、TCP心跳包
23、路由器与交换机的区别
24、UDP如何实现可靠传输
应用层:
25、DNS域名系统。采用TCP还是UDP协议?为什么?
26、FTP协议(了解)
27、HTTP请求报文与响应报文首部结构
28、HTTP1.0、HTTP1.1、HTTP2.0对比
29、HTTP与HTTPS对比
30、HTTPS加密流程
31、方法:GET、HEAD、POST、PUT、DELETE
32、状态码:1、2、3、4、5**
33、cookie与session区别
34、输入一个URL到显示页面的流程(越详细越好,搞明白这个,网络这块就差不多了)
参考书籍:《计算机网络》(第5版)、《TCP/IP详解卷1:协议》、《图解HTTP》
下载地址:

  • 链接:https://pan.baidu.com/s/1fRYNn3E0yEOLiQUSyBlxKg
  • 提取码:69dc
三、操作系统(1个月)

1、进程与线程区别
2、线程同步的方式:互斥锁、自旋锁、读写锁、条件变量
3、互斥锁与自旋锁的底层区别
4、孤儿进程与僵尸进程
5、死锁及避免
6、多线程与多进程比较
7、进程间通信:PIPE、FIFO、消息队列、信号量、共享内存、socket
8、管道与消息队列对比
9、fork进程的底层:读时共享,写时复制
10、线程上下文切换的流程
11、进程上下文切换的流程
12、进程的调度算法
13、阻塞IO与非阻塞IO
14、同步与异步的概念
15、静态链接与动态链接的过程
16、虚拟内存概念(非常重要)
17、MMU地址翻译的具体流程
18、缺页处理过程
19、缺页置换算法:最久未使用算法、先进先出算法、最佳置换算法
ps:操作系统的内容看起来不是很多,实际上每个问题答案的底层原理要弄懂还是很考验基本功的。比如:互斥锁与自旋锁的区别,实际上涉及到阻塞时线程的状态是不一样的。互斥锁阻塞的线程是挂起的,此时系统会优先执行其它可执行的线程,就会将阻塞的线程切换到可执行线程,而当临界区执行的时间非常短时,此时线程切换频繁、开销较大,此时就会采用自旋锁的方式,让阻塞的线程处于忙等状态。

参考书籍:《深入理解计算机系统》
下载地址:

  • 链接:https://pan.baidu.com/s/1RoDN317X-C6izxY6CwuxTA
  • 提取码:iy8u

四、网络编程(1个月)

1、IO多路复用:select、poll、epoll的区别(非常重要,几乎必问,回答得越底层越好,要会使用)
2、手撕一个最简单的server端服务器(socket、bind、listen、accept这四个API一定要非常熟练)
3、线程池
4、基于事件驱动的reactor模式
5、边沿触发与水平触发的区别
6、非阻塞IO与阻塞IO区别
参考书籍:《Unix网络编程》
ps:网络编程掌握以上几点就够了,要搞明白还是要花很久时间的。
下载地址:

  • 链接:https://pan.baidu.com/s/1MD9WAAmSOCz5fhlUMU0bsg
  • 密码:bwyt

五、数据结构与算法及刷题(2个月)

1、数组
2、链表
3、栈
4、队列
5、堆
6、二叉树:二叉搜索树、平衡树、红黑树
7、B树、B+树
8、哈希表及哈希冲突
9、排序算法:冒泡排序、简单选择排序、插入排序、希尔排序、归并排序、堆排序、快速排序
(要求能够面试时手写出堆排序和快速排序)
10、二分法:旋转数组找target
11、回溯法:全排列、复原IP地址
12、动态规划(掌握基本的动态规划的几个题其实就够了,如:斐波那契数列、接雨水、股票的最佳买入时机)
参考书籍:《图解算法》《剑指offer》
ps:建议刷题与数据结构算法同时进行,这样理解得更深入。刷题网站leetcode,刷完《剑指offer》其实就能解决大部分面试手撕了。
书籍下载:

  • 链接:https://pan.baidu.com/s/1GZEp8KI1Fm0U4Uek7BOWAw
  • 提取码:am4o
六、mySQL数据库(7天~15天)

1、数据存储引擎:InnoDB、myISAM、Memory
2、数据库索引类型及原理:B+树索引、哈希表索引
3、锁:悲观锁、乐观锁
4、事务:事务的四大特性(ACID)、事务并发的三大问题、事务隔离级别及实现原理
5、多版本并发控制实现机制(MCVV)原理
参考书籍:《高性能MySQL》
ps:这里也可以参考本人写的博客:mysql知识点总结。
下载地址:

  • 链接:https://pan.baidu.com/s/1-_9Cwq1qCxAr041nDWe0sg
  • 提取码:fy0y
七、项目(2个月)

如果时间够的话就可以写一个项目,当然大部分人写的项目都是一个烂大街的项目,也就是“web高性能服务器”。其实就是根据陈硕大神写的《Linux高性能服务器编程:使用muduo C++网络库》进行改编,当然啦,读懂这本书还是很耗时的,学习其中的思想也会受益匪浅的。
总结
按照上面推荐的内容来学习的话,要学习得深入一点的话1年的时间肯定需要的,甚至2年也不足为其。当然对于非科班的学生来说,大部分都没有充足的时间的,这时候建议尽量把C++基础、计算机网络、操作系统、网络编程、数据结构与算法这五个部分的内容学得很扎实,大概6个月的时间。
戳下面获取面试真题:
大厂15万字C++开发面试手册出炉(C++和计算机基础全有)​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487041&idx=1&sn=1c49fe6e12b1e52f66462b8b942e1644&chksm=fdb3f09fcac47989e399f52a975a6d2b18bd15e8cdfe720e3d878866f2d05c758318e2f6241f#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487041&idx=1&sn=1c49fe6e12b1e52f66462b8b942e1644&chksm=fdb3f09fcac47989e399f52a975a6d2b18bd15e8cdfe720e3d878866f2d05c758318e2f6241f#rd另外想要校招进大厂的同学,东哥熬夜给大家准备了一份资料:
校招进大厂,9大核心课程知识,熬夜整理成思维导图送给大家​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247487009&idx=1&sn=4495414184e17ee2c4c22cf4f55db467&chksm=fdb3f0ffcac479e9c97c6f70662ae09976b3bf3d49aab7a12bb950db8f8a7502dc39fc24c5e3#rd八、推荐阅读书单
正如侯捷老师所说C++ 相关的书籍也非常多,如天上繁星。 广博如四库全书者有 《The C++Programming Language》 《C++ Primer》,深奥如山重水复者有《The Annotated C++ Reference Manual》、《Inside The C++ Object Model》,细说历史者有《The Design And Evolution Of C++》、《Rumiations on C++》,独沽一味者有《Polymorphism in C++》、《Genericity in C++》,独树一帜者有《Design Patterns》、《C++ FAQs》,程序库大全有之《The C++ Standard Library》.....
至于书单的话,可以看下这个C++ 最全书单,包含几十本经典的PDF和下载方式:
华为最牛逼的c++ 基础与提高PDF​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486995&idx=1&sn=382ef6a0c1d20bdcc4531463024a8060&chksm=fdb3f0cdcac479dbf38c2db05f3d57ef6cb2acbd2edf977244523026a58258520a784933810b#rd(PS:侯捷 C++ 视频课程一直都被看过的同学广为推荐,最近发现 B 站关于侯捷老师的 C++ 视频课程几乎全部被下架了,于是自己搜集了一套非常全的视频,大家赶紧去下载保存备用:
侯捷C++全套视频|含下载方式​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd​mp.weixin.qq.com/s?__biz=MzU4MjgwNjQ0OQ==&mid=2247486987&idx=1&sn=6002f1b0c275f97a33ee2e3e8f53ab4f&chksm=fdb3f0d5cac479c3368acf8cecbf5b0669ff76db88b3f32d3543fcd8f0f5c820845102493c16#rd他们让知识的传播变得更加的便捷,降低了后来者的学习门槛,当然啦也变相加重了内卷化.
最后给大家介绍一份计算机经典书籍,送大家一份硬核书籍资源:读大学跟工作期间,我买了很多书,大部分是一些技术书籍,也收集了这些书籍的电子版,都在这里,现在免费share给大家,包括了计算机类常用电子书,包括C,C++,Java,Python,Java,Linux,Go等,希望大家能认真阅读。点击下方链接直达获取:
计算机经典必读书单(含下载方式)

码字不易,硬核码字更难,希望大家不要吝啬自己的鼓励,给我 :
@码农出击
一个点赞,鼓励下我!
zijiang 发表于 2023-10-13 01:13:58|来自:北京 | 显示全部楼层
大家可以试着四周看看,身边还有多少朋友真的在工作上用着C++,特别是国内互联网,这个几乎没有早期软件业历史包袱的产业。
一个东西难不难学,最主要的是环境。我相信很多人觉得英语难学,但是工作需要,旅游必须,跨服玩网游也得多少学两句,也就这么学下来了,不会有人在知乎上问为什么English是最难学的语言。C++这门语言天然就是基于C做的工程改良语言,不管怎么想,都不会比Haskell(编程范式上的巨大差异),比typescript(各种奇怪的细节和约定俗成,以及快速发展的社区和兼容性问题),比python(高度密集的代码信息熵),比Verilog(反常识的并行性)要来的难学。但是人人张口就是C++难学,是为什么呢?
距离。大家距离C++太远了,不仅自己对C++的认识仅仅在学校里的大作业,身边也没有太多的朋友在拿着C++当饭碗。大家也距离C++太近了,学校里的接触,对软件业的历史的了解,都让大家知道了有这么一种语言,他曾经支撑起了整个软件业的一大块基础,他有着众多地特性,甚至后来的语言,上来都喜欢第一个拿他来做比较。
C++真的很好玩,他真的一点都不难学,这是一门有历史的语言,是软件业工程实践的沉淀。他很好入门,会C就可以写出Hello World,他很追新,总是尽量去适配软件业的最新潮流,他也很保守,永不放弃对内存的绝对控制,他也很活泼,auto,lambda都很好用。
在我眼中,C++是没有之一的最有魅力的语言,是我的编程导师,学任何语言feature,我第一时间想的就是C++去实现他的编译/解释器应该是个什么样子的。
希望大家也能喜欢这门古老的语言,并且欣赏他的魅力,而不去惧怕一些别人的流言。他真的很简单,工程而纯粹。
kpyes 发表于 2023-10-13 01:14:07|来自:北京 | 显示全部楼层
谁说的?
peterll 发表于 2023-10-13 01:14:31|来自:北京 | 显示全部楼层
你觉得它难肯定是因为你没有理解它。一般人学习语言都是抱着语法书,而C++的特性多,规则多,根本无法用人类的语言简单总结从而快速记忆,必须要实践,实践,再实践,才能形成条件反射一样的记忆。然而很多人就算知道需要实践,都不知道如何下手。
实践很重要,但是还不足借以达到完全理解C++。语言的本质都只是更低一层语言的语法糖,所以需要先理解低一层的语言,最终要先理解计算机原理。其实很多东西到最后已经很难严格说是语言的范畴还是其他的范畴,比如有些概念明显是属于操作系统的,但是最终以语言的形式表现出来了。另一方面,往上来说,发明一种语言或者新增一个语言特性必然是为了解决一些问题,你必须处在那个问题的情境之中,才能更好的理解问题的所在,以及为什么要这样解决。
总的来说,表面上是一门语言,但实际上它包含了一个体系的知识,这个体系还历经发展演变,是很多经验的总结。这么多东西你想单单通过一本尽管很厚的语法书能去完全理解它,难就可想而知了。

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则