一、联系:历史渊源与语法传承
- 历史演进关系
- C 是'源头':1972 年由贝尔实验室的 Dennis Ritchie 开发,最初用于编写 Unix 操作系统,奠定了结构化编程的基础。
C、C++、C#三种语言在历史渊源上存在继承关系,C 是基础,C++ 扩展了面向对象,C# 借鉴语法但基于 .NET。核心区别在于编程范式(过程 vs 多范式 vs 面向对象)、内存管理(手动 vs RAII/智能指针 vs GC)、运行环境(机器码 vs IL/JIT)。类型系统从弱类型到强类型抽象,标准演进速度不同。应用场景涵盖底层系统、高性能计算及企业级开发。三者并非替代关系,而是根据硬件控制能力与开发抽象程度的权衡在不同软件栈层级各司其职。

三者均使用 {} 划分代码块、; 作为语句结束符,变量声明、循环(for/while)、条件判断(if-else)等基础语法高度相似,降低了跨语言学习的成本。
struct 组织数据,function 实现逻辑)。malloc()/free() 分配和释放内存,程序员需手动控制内存生命周期,易出现内存泄漏、野指针等问题。new/delete),同时引入 RAII(资源获取即初始化)机制(通过对象生命周期自动管理资源),并提供智能指针(unique_ptr/shared_ptr)减少手动操作,平衡灵活性和安全性。| 特性 | C | C++ | C# |
|---|---|---|---|
| 面向对象 | 不支持(仅 struct) | 支持(类、继承、多态、虚函数) | 支持(单一继承 + 接口,属性/事件) |
| 指针 | 核心特性 | 支持(但可通过智能指针弱化) | 限制使用(需 unsafe 块) |
| 泛型/模板 | 不支持 | 支持(模板,功能强大但复杂) | 支持(泛型,语法更简洁) |
| 异常处理 | 不支持 | 支持(try-catch-throw) | 支持(更完善的异常体系) |
| 标准库 | 精简(如 stdio.h) | 丰富(STL 容器、算法等) | 庞大(.NET 类库,涵盖网络、GUI 等) |
| 跨平台性 | 强(需重新编译) | 强(需重新编译) | 强(依赖 .NET 运行时) |
malloc分配)、静态区(全局变量),没有任何'内存保护'机制。例如,指针可以直接访问任意地址(int* p = (int*)0x123456;),越界访问、野指针等问题完全依赖程序员规避。struct 兼容),但引入虚函数表(vtable)实现多态(额外的内存开销,通常在对象首地址存放 vtable 指针);std::vector 析构时自动释放内存),本质是'用对象封装手动管理逻辑';std::shared_ptr)通过引用计数实现半自动管理,但底层仍依赖 new/delete,且存在循环引用等陷阱。class)在托管堆上分配,由 GC 自动回收(基于'代际回收'算法,优先回收短期对象);struct)在栈上分配(或嵌入引用类型),避免 GC 开销;unsafe 块),且通过类型安全检查(如数组访问边界校验)杜绝缓冲区溢出。.exe、.so)。因此,跨平台需针对不同架构(x86、ARM)重新编译。.exe 或 .dll);这种'二次编译'带来跨平台能力(.NET Core 支持多系统),但 JIT 编译会产生启动延迟(可通过 AOT 编译缓解)。
int、char 等)和结构体(struct),struct 只能包含数据,不能包含函数(C99 允许匿名结构体,但本质仍是数据聚合)。无'继承''多态'概念,类型扩展完全依赖函数参数(如 void* 实现泛型模拟,但类型不安全)。class)作为核心类型,支持:
virtual 关键字定义虚函数,子类重写实现多态(依赖 vtable 机制);std::vector<int> 和 std::vector<string> 是两个独立类型),支持模板特化、可变参数模板等高级特性,但语法复杂且易导致代码膨胀;dynamic_cast 和 typeid 获取对象实际类型,但会增加性能开销,且被很多开发者视为'反模式'。object(包括基本类型,如 int 本质是 System.Int32 的别名);where T : class);interface):取代多重继承,强制实现特定方法,无状态且可多实现;delegate)和事件(event):封装函数指针,实现类型安全的回调(C/C++ 需手动管理函数指针,易出错)。int 转 char、void* 转任意指针),编译器几乎不做类型校验,风险完全由开发者承担。int 转 long),同时通过 explicit 关键字禁止构造函数的隐式转换,减少意外类型转换。int 转 short 必须显式强制转换),且编译期会检查所有类型匹配,运行时通过 CLR 确保类型安全(如 InvalidCastException)。C 的标准更新极慢(约 10 年一次),核心目标是保持与旧代码的兼容,仅增加必要特性:
long long、变长数组(VLA)、// 注释;_Generic);至今,C 仍没有异常处理、泛型、面向对象等'高级特性',保持'小巧、高效、可移植'的底层定位。
C++ 标准自 2011 年起进入'快速迭代'(每 3 年一版),不断吸收现代编程理念:
auto、Lambda 表达式、智能指针、右值引用(移动语义);constexpr 函数、结构化绑定;module)、协程(co_await)、概念(concept),试图解决'头文件依赖''模板复杂'等历史问题。但 C++ 的'兼容性优先'原则导致语法臃肿(如同时支持 C 风格数组和 std::array),学习曲线陡峭。
C# 的演进完全依附于.NET 平台,特性设计以'提升开发效率'为核心:
async/await 异步模式,解决回调地狱;string?),减少空指针异常;record)、顶级语句,简化数据载体定义。C# 的特性更新更'激进',但因有 CLR 兜底,兼容性问题较少(通过 #nullable enable 等开关控制)。
stdio.h 等基础库),依赖平台特定库(如 Windows 的 Win32 API),工具链以 GCC、Clang 为主,强调'手写优化'(如汇编插入)。vector、map)和算法,但功能有限;依赖 Boost 等第三方库扩展能力(如网络、多线程);工具链复杂(不同编译器对标准的支持差异大,如 MSVC vs GCC)。cdecl、stdcall)是跨语言交互的'通用协议'。C++ 可直接调用 C 函数(通过 extern "C" 避免名字修饰);C# 通过 [DllImport](P/Invoke)调用 C 动态库。C、C++、C# 本质是'硬件控制能力'与'开发抽象程度'的权衡:
三者并非替代关系,而是在软件栈的不同层级各司其职——例如,一个游戏可能用 C 写引擎核心,C++ 封装游戏逻辑,C# 开发编辑器工具。理解这种差异,才能在合适的场景选择合适的语言。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online