【保姆级】C语言、C++、C#的区别和联系

简介: C++是C语言的扩展,增加面向对象与泛型编程,二者血脉相连;C#虽名含“C”,实为微软2000年推出的独立语言,基于CLR虚拟机,与C/C++无继承关系。三者同居TIOBE前列,但渊源各异。

C语言、C++ 和 C# 都是非常流行的编程语言,通常都位于世界编程语言排行榜(TIOBE)的前 5 名。它们的名字都以字母“C”开头,看起来有着千丝万缕的联系。


不错,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++ 没有半毛钱关系。

相关文章
|
20天前
|
存储 Unix Shell
【最新版】ASCII码一览表,ASCII码对照表(全网最详细)
ASCII(美国信息互换标准代码)是基于拉丁字母的7位字符编码标准,共128个字符,涵盖英文字母、数字、标点及控制符(如NUL、CR、LF等),广泛用于编程与通信。它等同于ISO/IEC 646国际标准。
547 0
|
12天前
|
编译器 Linux C语言
【保姆级】MinGW-w64下载、安装、配置、实战开发一篇搞定(送官方安装包)
MinGW-w64 是一款免费开源的 Windows 原生 GCC 编译环境,轻量(数百MB)、免安装、命令行友好,支持 C/C++ 编译为原生exe,无需VS大体积IDE,完美兼容Linux开发习惯。
297 0
|
14天前
|
SQL NoSQL 关系型数据库
Navicat Premium 17永久免费版下载(最新,亲测有效,附图文教程)
Navicat Premium 17 是一款全能型数据库管理工具,支持 MySQL、SQL Server、PostgreSQL、Oracle、MongoDB 等十余种主流数据库。界面直观、操作便捷,新手可快速上手,开发者能高效管理多库。
314 0
|
15天前
|
人工智能 算法 安全
数据防泄密软件:光加密还不够,得把泄的口子都堵上
防泄密不能只靠加密!截图、手机拍照、拖拽外发等行为,加密根本拦不住。真正有效的DLP方案需覆盖“加密+沙箱+外发审批+截屏管控+水印溯源+操作审计”全链路,堵住每一条泄密路径,兼顾安全与办公体验。
132 0
|
15天前
|
自然语言处理 数据可视化 关系型数据库
企业级数据可视化解决方案:免费的BI产品推荐
阿里云Quick BI 2026年升级AI-native架构,免费提供个人版(0.1元/年)与30天全功能试用,覆盖数据安全、行列级权限、大屏展示及智能小Q自然语言分析(500次问数等),助力企业低成本验证真实场景,实现从“看数”到“问数”的高效跃迁。(239字)
|
16天前
|
JSON 算法 数据挖掘
社区与学习资源:从入门到精通的API选品学习路径
本文系统梳理API选品学习路径:入门阶段夯实选品逻辑与工具认知;进阶阶段掌握API调用、数据清洗与分析建模;精通阶段构建自动化流程、深研平台算法并开展长期数据规划。附权威资源推荐与实操建议,助力新手高效成长为数据驱动型选品专家。(239字)
|
20天前
|
算法 网络协议 网络架构
【保姆级】IP地址、MAC地址、端口号的区别/联系(全网最详细)
本文详解网络通信三大核心要素:IP地址(定位设备所在网络)、MAC地址(唯一标识网卡,实现局域网内精准寻址)和端口号(区分同一设备上的不同服务)。三者协同工作,确保数据准确送达目标程序。
116 0
|
20天前
|
网络协议 Unix Linux
socket套接字到底是什么东西(全网最详细,图解)
网络编程核心是让联网计算机交换数据,而socket(套接字)正是实现通信的关键抽象。它在Linux中被视为文件描述符,支持read/write操作;Windows中则用句柄管理。主流分为TCP(SOCK_STREAM,可靠、有序、无边界)和UDP(SOCK_DGRAM,高效、无序、有边界)两类,分别适用于网页浏览与实时音视频等场景。
251 0
|
21天前
|
存储 Java 数据库连接
第044篇 ThreadLocal 原理:主线程到底能不能用
ThreadLocal核心在于“线程独享+弱引用Key+强引用Value”:每个线程持独立ThreadLocalMap,Key为ThreadLocal弱引用,Value强引用用户对象;若不显式remove,线程池复用时易致内存泄漏与数据串号。务必在finally中清理!
79 0
|
21天前
|
存储 传感器 缓存
第001篇 变量与基本类型:整型、浮点与包装类型
Android面试首题常考变量与基本类型——看似简单,实则暴露候选人是否“理解Java”而非仅“用过”。从步数存储选型、int溢出陷阱、浮点精度误区,到包装类缓存机制、static生命周期等,每个细节都关乎线上稳定性。扎实掌握八种基本类型的本质、边界与坑点,是进阶的真正起点。
77 0

热门文章

最新文章