首页 > 编程笔记 > C语言笔记(精华版)
C语言、C++和C#的区别(非常详细)
C语言、C++ 和 C# 都是非常流行的编程语言,通常都位于世界编程语言排行榜(TIOBE)的前 5 名。它们的名字都以字母“C”开头,看起来有着千丝万缕的联系。
不错,C++ 确实是在C语言的基础上发展而来的,它们之间是包含与被包含的关系;但是,C# 就是一门独立的语言了,它和 C、C++ 都没有什么关系。
顾名思义,C++ 就是在C语言的基础上增加了新特性,玩出了新花样,所以才说 Plus;而且有两个 plus,足见 C++ 增加了很多新东西。这就像 Nokia 和 iPhone、手动变速箱和自动变速箱的关系。
C语言是 1972 年由美国贝尔实验室开发成功的,在当时算是高级语言,它的很多新特性都让汇编程序员羡慕不已,就像今天的 Golang 和 Rust,刚出生就受到追捧。C语言也是“时髦”的语言,后来的很多软件都用C语言开发,包括 Windows、Linux、macOS、MySQL、Python 等。
但是随着计算机性能的飞速提高,硬件配置与几十年前已有天壤之别,软件规模也不断增大,很多软件的体积都超过 1G,例如 PhotoShop、Visual Studio 等,用C语言开发这些软件就显得非常吃力了,这时候 C++ 就应运而生了。
C++ 主要在C语言的基础上增加了面向对象和泛型的机制,提高了开发效率,以适用于大中型软件的编写。
这个时期的 C++ 非常粗糙,仅支持简单的面向对象编程,也没有自己的编译器,而是通过一个预处理程序(名字叫 cfront),先将 C++ 代码“翻译”为C语言代码,再通过C语言编译器合成最终的程序。
随着C++的流行,它的语法也越来越强大,已经能够很完善的支持面向对象编程和泛型编程。但是一直也没有诞生出新的 C++ 编译器,而是对原来C编译器不断扩展,让它支持 C++ 的新特性,所以我们通常称为 C/C++ 编译器,因为它同时支持 C和C++,例如:
也就是说,你写的 C、C++ 代码都会通过一个编译器来编译,很难说 C++ 是一门独立的语言,还是对C的扩展。
更重要的是,这些知识你很难全部吸收,会严重打击你的信心,失去学习的兴趣。
从“学院派”的角度来说,C++支持面向过程编程、面向对象编程和泛型编程,而C语言仅支持面向过程编程。就面向过程编程而言,C++ 和 C 几乎是一样的,所以学习了C语言,也就学习了 C++ 的一半,不需要从头再来。
没有任何编程基础的读者,我建议先从C语言学起,不要贪多嚼不烂。等你熟悉了C语言,能写出上百行代码的程序了,就对编程有些概念了,这个时候再去了解 C++ 增加的那一部分内容(也即面向对象编程和泛型编程),你就站在了一定的高度,学起来不会那么吃力了。
图:C++ 和C语言的关系
其实 C# 刚开始叫 COOL,只是后来和 Java 产生了法律纠纷,被迫改命为 C#。你看看 COOL 这个名字,就知道它和 C/C++ 没有关系了!
C# 虽然借鉴了一些 C/C++ 的语法和特性,但是在底层实现和运行原理上和 C/C++ 是完全不同的,所以笔者才说 C# 是一门独立的语言,和 C/C++ 没有半毛钱关系。
至于为什么叫 C# 而不叫别的,那就不得而知了,难道是为了便于推广,沾一下 C/C++ 的喜气?哈哈~~~
早期的 C# 只能用于 Windows 平台,现在的 C# 已经支持跨平台了,在 Linux、macOS 下也可以使用了。
C# 主要用于桌面 GUI 程序、网站后台、游戏(特别是使用 Unity 引擎)、云计算、大数据等几个开发领域。
不错,C++ 确实是在C语言的基础上发展而来的,它们之间是包含与被包含的关系;但是,C# 就是一门独立的语言了,它和 C、C++ 都没有什么关系。
C++和C语言的关系
C++ 读作“C加加”,是“C Plus Plus”的简称。顾名思义,C++ 就是在C语言的基础上增加了新特性,玩出了新花样,所以才说 Plus;而且有两个 plus,足见 C++ 增加了很多新东西。这就像 Nokia 和 iPhone、手动变速箱和自动变速箱的关系。
C语言是 1972 年由美国贝尔实验室开发成功的,在当时算是高级语言,它的很多新特性都让汇编程序员羡慕不已,就像今天的 Golang 和 Rust,刚出生就受到追捧。C语言也是“时髦”的语言,后来的很多软件都用C语言开发,包括 Windows、Linux、macOS、MySQL、Python 等。
但是随着计算机性能的飞速提高,硬件配置与几十年前已有天壤之别,软件规模也不断增大,很多软件的体积都超过 1G,例如 PhotoShop、Visual Studio 等,用C语言开发这些软件就显得非常吃力了,这时候 C++ 就应运而生了。
C++ 主要在C语言的基础上增加了面向对象和泛型的机制,提高了开发效率,以适用于大中型软件的编写。
C和C++的血缘关系
早期并没有“C++”这个名字,而是叫做“带类的C”。“带类的C”是作为C语言的一个扩展和补充出现的,目的是提高开发效率,如果你有 Java Web 开发经验,那么你可以将它们的关系与 Servlet 和 JSP 的关系类比。这个时期的 C++ 非常粗糙,仅支持简单的面向对象编程,也没有自己的编译器,而是通过一个预处理程序(名字叫 cfront),先将 C++ 代码“翻译”为C语言代码,再通过C语言编译器合成最终的程序。
随着C++的流行,它的语法也越来越强大,已经能够很完善的支持面向对象编程和泛型编程。但是一直也没有诞生出新的 C++ 编译器,而是对原来C编译器不断扩展,让它支持 C++ 的新特性,所以我们通常称为 C/C++ 编译器,因为它同时支持 C和C++,例如:
- Windows 下的微软编译器(Visual C++);
- 在 Linux 上广泛应用的 GCC 编译器;
- 跨平台且高性能的 Clang 编译器。
也就是说,你写的 C、C++ 代码都会通过一个编译器来编译,很难说 C++ 是一门独立的语言,还是对C的扩展。
关于C++的学习
C++ 语法繁杂,是最恶心的编程语言,没有之一。如果针对没有任何编程经验的读者写一本 C++ 的书,那将是一项不小的任务,写出来的书也会非常厚。即使这样,也仅仅是在讲语法。更重要的是,这些知识你很难全部吸收,会严重打击你的信心,失去学习的兴趣。
从“学院派”的角度来说,C++支持面向过程编程、面向对象编程和泛型编程,而C语言仅支持面向过程编程。就面向过程编程而言,C++ 和 C 几乎是一样的,所以学习了C语言,也就学习了 C++ 的一半,不需要从头再来。
没有任何编程基础的读者,我建议先从C语言学起,不要贪多嚼不烂。等你熟悉了C语言,能写出上百行代码的程序了,就对编程有些概念了,这个时候再去了解 C++ 增加的那一部分内容(也即面向对象编程和泛型编程),你就站在了一定的高度,学起来不会那么吃力了。
图:C++ 和C语言的关系
关于C#
C#(发音为 C Sharp)是微软在 2000 年发布的一门新语言,旨在对抗如日中天的 Java。和 Java 类似,C# 也采用了虚拟机机制;但是为了和 Java 进行区分,C# 中的虚拟机叫做公共运行时(Common Language Runtime,CLR)。其实 C# 刚开始叫 COOL,只是后来和 Java 产生了法律纠纷,被迫改命为 C#。你看看 COOL 这个名字,就知道它和 C/C++ 没有关系了!
C# 虽然借鉴了一些 C/C++ 的语法和特性,但是在底层实现和运行原理上和 C/C++ 是完全不同的,所以笔者才说 C# 是一门独立的语言,和 C/C++ 没有半毛钱关系。
至于为什么叫 C# 而不叫别的,那就不得而知了,难道是为了便于推广,沾一下 C/C++ 的喜气?哈哈~~~
早期的 C# 只能用于 Windows 平台,现在的 C# 已经支持跨平台了,在 Linux、macOS 下也可以使用了。
C# 主要用于桌面 GUI 程序、网站后台、游戏(特别是使用 Unity 引擎)、云计算、大数据等几个开发领域。
总结
C++ 和C语言有着血缘关系。C++ 在C语言的基础上发展而来,增加了很多新特性和新功能,比C语言更加强大,可以认为:C++ 几乎完全包含了C语言,而C语言也可以看做 C++ 的一部分。C++ 源文件的后缀是 .cpp,C语言源文件的后缀是 .c,你在 .cpp 文件中写C语言代码通常也是没问题的。但是请注意,C++ 仍然舍弃或者改变了极少量的C语言特性,所以在实际开发中,我们最好还是要区分 C++ 和C语言的。
C# 是一门完全独立的语言,它和C语言、C++ 没有半毛钱关系。