C\C++\python对比_概览(1)

张开发
2026/4/9 19:11:21 15 分钟阅读

分享文章

C\C++\python对比_概览(1)
0、前言对C、C、python的学习有了专项笔记现在需要进行对比对比的目的是熟悉掌握这三种语言。这个文章我计划是放在知识蒸馏系列当中我认为真正掌握一门知识的体现就是“书越读越薄”所以从概览的角度总结这三门语言的区别对于对比记忆很有帮助。我担心这部分对比可能不是很全面所以文章题目后面加了1后续针对概述的每个部分进行真实测试和梳理汇总加深了解同时完成对这篇概览文章的优化和迭代以后就可以直接通过这篇文章梳理自己对这三门语言的记忆框架达到提纲挈领的目的。掌握一门编程语言要懂的数据类型 → 能处理什么数据语法规则 → 代码怎么写内存与运行机制 → 代码在计算机里怎么跑、数据怎么存语言特性与编程范式 →这门语言的设计思想这门语言适合怎么写、最佳实践是什么这么语言是面向过程还是面向对象的怎么写出来高效且优雅。0.1、C和C以及python的用途对比C面向过程、底层、高性能用途操作系统、嵌入式、驱动、高性能工具C面向过程 面向对象、兼顾底层与上层用途游戏引擎、音视频、大型软件、高性能计算Python解释型、高开发效率用途数据分析、爬虫、Web 开发、AI、自动化脚本。0.2、环境配置、运行方式、代码执行流程之间的对比运行方式C/C编译型需编译链接Python解释型直接运行环境搭建C/C 需编译器如 GCC/VSPython 需解释器 pipIDE 选择代码执行流程C/C编写→编译→运行Python编写→直接运行。说明C和C是编译型语言编译型语言的特点就是要先整体编译成机器码再执行执行速度快但是对于不同的平台需要重新编译CPU架构和操作系统这两者有一个不一样就要重新编译CPU架构不同指令集就不同操作系统不同生成的可执行文件格式就不同因此可移植性低编译耗时开发效率低而python是解释型语言通过解释器一边解释一边运行执行速度慢源代码可以跨平台运行只要每个平台配对应的解释器即可因此可移植性高开发效率高一边写一边运行。0.3、基于windows环境在vs code中配置运行的方式区别给vs code部署python1、根据平台环境下载对应版本python的解释器在终端中测试python是否正常安装python -v2、在vs code中安装python拓展Python extension for Visual Studio Code3、在vs code中创建项目文件夹然后在项目文件夹路径下通过python -m venv .venv 使用venv模块创建虚拟环境运行venv的Scripts中的activate或者Activate.ps1激活虚拟环境激活后终端前面会有.venv4、选择python解释器在vs code中按住ctrlshiftP选择venv\Scripts\python.exe作为解释器5、然后就可以写程序了程序写好之后可以直接点击运行按钮也可以在终端通过“调用操作符”【 python解释器路径 执行程序路径】给vs code部署C/C1、安装 MinGW-w64编译器。2、把编译器路径添加到系统PATH。3、在终端中输入g -v查看是否正确安装。4、在vs code中安装C/C extension for Visual Studio Code插件。python和C在依赖管理上有很大差别【具体可以参考本文第三节】1、Python有虚拟环境和pip而C主要通过 构建系统CMake、包管理器类似于python中的pip、手动安装库下载库源码、编译、放到系统路径【usr\include或者usr\lib】三种方法来解决库依赖但是手动安装库项目依赖混乱。2、现在很多都是CMakevcpkg进行C项目开发。3、C常用的包管理工具也支持C语言库但C语言还有一些更轻量化的专属工具比如vcpkg它是跨平台的支持C/C微软维护库比较全易用pkg-config是linux\macOS原生的轻量无需安装额外工具还有apt、yum、brew这些系统级包管理工具。1、基础对比1.1、基本语句结构对比C和C每条语句后面要有分号python主要靠缩进。1.1.1、格式化输入对比C语言scanf#includestdio.hintmain(){intscore;printf(请输入成绩);scanf(%d,score);printf(你的成绩是%d\n,score);return0;}C语言一方面兼容c的语法另一方面也有自己的输入流cin#includeiostreamusingnamespacestd;intmain(){intscore;cout请输入成绩;cinscore;cout你的成绩是scoreendl;return0;}pythoninputn.输入scoreint(input(请输入成绩))print(你的成绩是,score)1.1.2、格式化输出对比C语言输出printf主要靠占位符printf(“格式字符串”, 参数)例如printf(“x%d\n”, x);C输出cout和printfcout 流操纵符setprecision 等 或 std::format (C20) / printf 也能用例如cout “x” x; cout std::format(“x{}\n”, x);python输出printf-string推荐、str.format、%例如print(fx{x})1.1.3、条件语句和其他语法区别C和C靠括号括条件花括号括条件体python靠空格区分条件靠冒号和缩进区分条件和条件体。python三元运算符真值 if 条件 else 假值1.1.4、循环语句区别循环语句for/while 用法如 Python 的for-in vs C/C 的for(初始化;条件;更新)C/C 和 Python 的 while 循环区别与 if 语句的区别基本一致跳转语句break/continue 通用C/C 有gotoPython 无。while循环C和C基本一致python有所不同1、python中的while后面条件不加括号换成了条件后面的冒号2、C和C中的花括号在python中用缩进替代3、python中没有或者–运算for循环c和c语言for循环结构for(初始化;条件;增量){循环体}// 例如for(inti0;i5;i){couti ;}python中的for循环for变量in可迭代对象:循环体# 例如foriinrange(5):print(i,end )C和C中还有do-while结构do{循环体;}while(条件);1.1.5、函数的区别C和C中函数结构写法返回值类型 函数名(参数类型1参数名1,参数类型2参数名2,...){// 函数体// 执行语句return返回值;// 无返回值时为 void不用 return}// 求两个整数的和intadd(inta,intb){returnab;}C 和 C 都要求如果函数定义在调用之后必须先声明前置声明通用声明格式// 参数只写类型也行不用写函数体结尾必须有 ;返回值类型 函数名(参数类型1,参数类型2,...);python中函数结构写法def函数名(参数1,参数2,...):# 函数体必须缩进# 执行语句return返回值# 没有 return 就默认返回 None# 求两个数的和defadd(a,b):returnabPython 是解释型语言没有函数声明这一说。但是要求调用之前要定义过函数不用单独声明。C/C必须写 类型返回值类型、参数类型和python一样行尾加冒号:用 {} 包裹结尾 ;Python不用写类型用 def 定义行尾 :靠 缩进 表示函数体。1.1.6、其他差异变量与类型C/C静态类型、需声明Python动态类型、无需声明代码块标识C/C大括号{}Python缩进输入输出Cprintf/scanfCcout/cint/兼容CPythonprint/input注释语法C/C//或/* */Python#或两对三个连续的双引号配对。1.2、常用数据结构对比C无内置高级结构需手动实现数组 / 链表仅原生数组只有基础类型 自定义结构体复杂度高CSTL 容器vector/map/set/string性能高抽象能力强库丰富Python内置列表 / 元组 / 字典 / 集合开箱即用性能相对低但开发速度极快。2、关键差异总结2.1、语法风格C: 面向过程、需要显式类型声明复杂抽象程度高C: 兼顾面向过程与面向对象支持泛型、智能指针基本同CPython: 动态类型、依赖缩进、代码可读性极高简洁更像伪代码2.2、内存管理C手动管理malloc/free需关注内存泄漏 / 野指针C手动new/delete 部分自动化智能指针Python自动垃圾回收GC无需手动管理。2.3、易用性 vs 性能C → 性能最高但开发负责度高C → 性能高抽象能力强库丰富Python → 性能相对低但开发速度极快3、第三方库 / 标准库3.1、概览标准库C极简stdio.h/stdlib.hCSTL 标准库Python丰富内置库第三方库获取C手动编译CCMake / 包管理器Pythonpip 一键安装典型基础库如 C 的math.hC 的iostreamPython 的math/random。3.2、关于C和C引入第三方库的核心机制详述★★★C和C引入第三方库的方式就和编译过程有关系了通过预编译展开头文件、通过编译生成目标文件、通过源代码 (.c/.cpp)↓【预编译】处理 #include, #define, 条件编译文本替换只是复制粘贴头文件内容函数声明、宏、类型定义↓【编译】生成汇编代码 (.s)语法检查 生成汇编↓【汇编】生成目标文件 (.o/.obj)汇编代码 → 机器码↓【链接】合并目标文件 库文件 → 可执行程序链接之前给程序声明画饼都可以在这个阶段就要兑现。对于静态库windows中是lib后缀会把库代码复制进可执行文件可执行文件会比较大对于动态库windows中是so后缀在运行时加载可执行文件会比较小。C和C的多文件项目如果要引入第三方库包含自己写的带头文件的程序源码用IDE会比较方便 IDE 的方便是封装了 Makefile不是取代了它。介绍自研库、静态库、动态库的区别✅ 自研库 静态 / 动态库的源码阶段自研库本质是未打包的源码.h 声明 .c 实现是构建静态 / 动态库的 “原材料”—— 你可以把自研库编译成静态库也可以编译成动态库。✅ 静态库 编译时 “拷贝进可执行文件”链接阶段会把静态库的二进制代码完整复制到最终的可执行文件里运行时完全不依赖外部库文件可执行文件是 “自给自足” 的。✅ 动态库 编译时 “只声明依赖”【运行时是否依赖原始库文件—— 依赖则是动态库不依赖则是静态库】链接阶段只在可执行文件里记录 “我需要 xxx 动态库”不拷贝任何库代码运行时操作系统会根据这个声明去系统路径里找对应的动态库文件如 libcurl.so找到才能运行找不到就报错。❗ 在 Python 中自研库、静态库、动态库的核心逻辑是相通的但具体形态、名称和使用方式和 C/C 有很大差异因为 Python 是解释型语言没有编译链接的强区分。Python 里的 “自研库” 就是你自己写的 .py 源码文件 / 文件夹和 C/C 自研库的 “源码阶段” 完全对应。将自研的 .py 代码打包成编译后的字节码包.pyc或源码归档包.egg/.whl安装时会把包的代码 “完整拷贝” 到 Python 的 site-packages 目录发生了拷贝运行时不依赖原始库文件运行时解释器直接加载本地拷贝的代码不依赖外部源文件Python 经常调用 C 编写的扩展库如 numpy/pandas 的核心模块这些库本质是 C 语言的动态库.so/.dll。# 把自研库打包成 .whl等价于静态库python setup.py bdist_wheel# 安装后代码被拷贝到本地主程序运行时无需原源码文件pipinstallmy_lib-1.0.0-py3-none-any.whl# 调用 C 写的动态库运行时依赖 libnumpy.so 存在等价于动态库importnumpy以C项目为例说明自研库、静态库、动态库1、头文件声明在 main.c 中通过 #include “mathlib/mathlib.h” 引入函数声明让编译器知道函数的名称、参数和返回值类型。2、代码实现mathlib.c 中实现了头文件里声明的函数编译后会生成目标文件.o或打包成库文件。3、链接阶段Makefile 会将 main.o 和 mathlib.o或 libmathlib.a链接在一起把函数调用的地址填充到最终可执行文件中让主程序能找到并执行库内的实现。以python项目为例说明自研库、静态库、动态库1、Python 解释器在运行时会按「自研库本地路径→ 静态库site-packages→ 动态库系统路径 / 本地路径」的顺序查找库三者的加载逻辑互不冲突可同时存在。2、自研库依赖本地 my_self_lib/ 源码文件夹静态库依赖 site-packages 里的拷贝文件和自研库源码无关numpy 动态库依赖系统的 numpy/core/_multiarray_umath.so 等动态库文件三者的依赖路径不同不会互相干扰。3、自研库写业务逻辑如数据清洗函数静态库安装公司内部封装的工具包打包成 .whl无需源码动态库调用 numpy/pandas/scipy都是 C 写的动态库依赖 .so/.pyd。4、异常 / 错误处理4.1、C的异常报错机制C无原生异常机制靠返回值 /errno 处理错误核心示例文件操作错误处理#includestdio.h#includeerrno.h#includestring.hintmain(){FILE*fp;// 尝试打开一个不存在的文件fpfopen(不存在的文件.txt,r);// 检查返回值是否为 NULL错误指示if(fpNULL){// 错误处理读取 errno 获取具体错误码printf(open default!\n);printf(error : %d\n,errno);printf(error infor: %s\n,strerror(errno));// 转换为可读字符串// 根据 errno 做具体处理if(errnoENOENT){printf(reason: file not here\n);}elseif(errnoEACCES){printf(reason: have no power\n);}return1;// 返回非0表示运行失败}// 正常操作...fclose(fp);return0;}4.2、C的异常报错机制Ctry-catch-throw 异常体系#includeiostream#includestdexcept// 标准异常类doubledivide(inta,intb){if(b0){throwstd::runtime_error(a除数不能为零);// 抛出异常}returnstatic_castdouble(a)/b;}intmain(){try{doubleresultdivide(10,0);// 可能抛出异常std::coutb结果: resultstd::endl;}catch(conststd::exceptione){// 捕获异常std::cerrc捕获错误: e.what()std::endl;}std::coutd程序继续执行...std::endl;return0;}4.3、python的异常报错机制Pythontry-except-else-finally 异常体系内置丰富异常类型。# 不处理异常程序会直接崩溃并抛出错误a10b0resulta/b# 除数为0触发 ZeroDivisionErrorprint(result)# 处理异常程序不会崩溃还能给出友好提示try:# 尝试执行的代码可能出错的代码a10b0resulta/bprint(f计算结果{result})# 出错时这行不会执行exceptZeroDivisionError:# 捕获到 除数为0 异常时执行的逻辑print(错误除数不能为0请检查输入的数值。)exceptExceptionase:# 捕获所有其他未预料到的异常万能捕获可选print(f发生了未知错误{e})else:# 没有异常时才会执行的代码可选print(计算成功完成)finally:# 无论是否有异常都会执行的代码可选比如释放资源print(程序执行结束finally 块。)5、面向对象类5.1、C只能模拟面向对象C无面向对象需手动模拟结构体 函数指针5.2、C支持面向对象C原生支持类、对象、继承、多态、封装【数据类型】类的成员变量、方法参数 / 返回值必须显式声明类型编译期就会检查类型是否匹配错误早暴露。【访问控制】有严格的访问修饰符public公开、private私有仅类内访问、protected受保护子类可访问编译期强制限制无法绕过。【继承机制】支持多继承但会带来菱形继承钻石问题需要用 virtual 关键字解决二义性语法复杂目的是兼顾性能和正确性。【构造和析构】构造函数可以重载多个析构函数必须手动释放内存、关闭文件、释放指针还有拷贝构造、移动构造重点解决内存拷贝的问题【方法特性】普通方法默认绑定类的实例静态方法属于类虚函数支持运行时多态支持方法重载。【类的实例化】C支持两种实例化影响内存位置。一种是栈实例Person p;自动销毁。一种是堆实例Person* p new Person();需要手动释放delete p。5.3、python支持面向对象Python原生支持极简语法无显式封装动态属性。【数据类型】类的成员无需声明类型运行时动态绑定类型同一个变量可以随时赋值不同类型。【访问控制】没有真正的访问控制仅靠命名约定self.name公开默认self._name约定私有提示开发者不要外部访问但实际能访问self.__name名称改写伪私有外部需用 _类名__name 访问并非真正禁止本质是 “君子协定”而非语法强制。【继承机制】天然支持多继承通过 MRO方法解析顺序 自动解决二义性如 C(A,B) 会按固定顺序查找父类方法语法简洁无需手动处理。【构造和析构】在python中__init__是初始化__new__是真正的构造但很少用。__del__是析构但极少用垃圾回收自动处理开发者不用关注内存。不存在拷贝构造的概念赋值拷贝依赖浅拷贝或深拷贝函数比较简单。【方法特性】实例方法默认带self参数静态方法需要加装饰器类方法也要加装饰器用来绑定类。天然支持多态子类重写父类方法即可不支持方法重载。【类的实例化】Python中实例化只有一种方式p Person(),垃圾回收自动销毁无需关心内存位置。6、线程和进程管理6.1、什么是进程和线程进程Process程序的 “独立运行实例”你双击打开的微信、浏览器、Python 脚本运行起来后就是一个进程。进程是操作系统分配资源内存、CPU 时间片、文件句柄等的最小单位。每个进程有自己独立的内存空间进程间不能直接访问对方的内存需通过管道、套接字等 “进程间通信IPC” 方式进程是 “重量级” 的创建 / 销毁进程需要操作系统分配 / 释放大量资源开销大C/C 中创建进程如 fork()/CreateProcess、Python 中 multiprocessing.Process本质都是告诉操作系统 “新建一个独立的资源容器运行指定代码”。线程Thread进程内的 “执行流”一个进程比如微信内部可以同时做很多事接收消息、刷朋友圈、播放语音每一个独立的 “做事路径” 就是一个线程。线程是操作系统调度 CPU 执行的最小单位。线程隶属于进程同一进程内的所有线程共享进程的内存空间比如全局变量、堆内存通信成本极低直接读写共享变量即可线程是 “轻量级” 的创建 / 销毁线程仅需分配少量栈内存开销远小于进程C/C 中 pthread/、Python 中 threading.Thread本质是在已有进程的资源容器内新建一个 CPU 执行流。6.2、在c、c、python中如何使用进程和线程进程是“资源容器”操作系统分配资源的最小单位线程是“执行流”操作系统调度 CPU 的最小单位C 直接调用操作系统内核接口实现进程 / 线程操作C 仅将操作系统的线程接口封装为标准库进程仍依赖 C 级系统调用Python 则基于 C 语言的底层接口对进程 / 线程做二次封装高度抽象且屏蔽底层细节。7、跨平台支持C、C、Python三者均支持跨平台但底层实现逻辑差异极大C/C 是 “底层可控但需手动适配”Python 是 “高度封装且开箱即用”。7.1、C语言跨平台支持【底层支持】几乎所有操作系统Windows/Linux/macOS/ 嵌入式都提供 C 语言编译器GCC/Clang/MSVC是跨平台的 “基础语言”【核心特点】语法本身跨平台但系统调用、硬件接口需手动区分平台如创建进程Linux 用 fork()Windows 用CreateProcess()文件路径Linux 用 /Windows 用 \【适配方式】通过预处理指令 #ifdef 区分平台如 #ifdef _WIN32 处理 Windows 逻辑#ifdeflinux处理 Linux 逻辑【总结】适配成本高需开发者熟悉不同系统的 API 差异但可控性极强嵌入式 / 内核级跨平台首选。7.2、C跨平台支持【底层支持】基于 C 的跨平台基础C 标准库试图屏蔽系统差异但非所有功能都完全跨平台【核心特点】标准库部分如容器 std::vector、算法完全跨平台无需适配。系统相关功能进程 / 线程、文件系统、网络仍需手动适配如 封装了底层线程接口但进程操作仍需区分 fork()/CreateProcess()编译器差异MSVC/GCC可能导致非标准语法如编译器扩展不兼容【适配方式】同 C 一样用 #ifdef 区分平台【总结】适配成本略低于 C标准库封装了部分通用逻辑但仍需关注系统和编译器差异。7.3、python跨平台支持【底层支持】Python 解释器CPython本身由 C 实现已适配各主流系统Windows/Linux/macOS开发者无需接触底层【核心特点】语法和标准库如 os/sys/threading完全跨平台同一行代码可在不同系统运行第三方库如 requests/pandas大多已做跨平台适配仅少数底层库如硬件驱动相关需额外处理跨平台运行仅需目标系统安装对应平台的 Python 解释器无需编译。【适配方式】基本上有个解释器就能实现自动跨平台【总结】适配成本极低几乎无需关注系统差异是上层应用跨平台的首选。8、常用应用领域通过什么工具实现xx开发功能8.1、C的常用应用领域底层系统开发操作系统内核Linux/Windows 内核、驱动程序硬件驱动工具 / 接口直接调用操作系统内核 API、GCC/Clang/MSVC 编译器嵌入式开发单片机STM32、物联网设备固件工具 / 接口Keil、GCC 嵌入式编译器、硬件寄存器操作接口高性能基础组件数据库内核MySQL 底层、网络协议栈TCP/IP 实现工具 / 接口POSIX 标准库、系统调用socket/fork。8.2、C的常用应用领域高性能应用开发游戏引擎Unreal Engine、工业仿真软件工具 / 接口C 标准库、Boost 库、DirectX/OpenGL 图形接口中间件 / 后端服务分布式存储Ceph、高并发服务器Nginx 部分模块工具 / 接口/ 线程库、ACE/ASIO 网络库桌面应用 / 大型软件CAD 软件AutoCAD、办公套件LibreOffice工具 / 接口Qt/MFC 框架、C 标准容器vector/map。8.3、python的常用应用领域数据分析 / 人工智能数据处理Pandas/Numpy、机器学习TensorFlow/PyTorch工具 / 接口Anaconda 环境、各类 AI 框架 APIWeb 开发后端接口Django/Flask/FastAPI、爬虫Scrapy/Requests工具 / 接口WSGI/ASGI 协议、requests/BeautifulSoup 库自动化 / 运维脚本运维Ansible 底层、自动化测试Selenium/Pytest工具 / 接口os/sys 标准库、paramiko远程操作、unittest 测试框架快速原型开发产品 demo、小工具开发工具 / 接口Python 标准库、第三方库如 tkinter 做简单 GUI。总结C聚焦底层 / 嵌入式 / 高性能基础组件依赖编译器 系统原生 API无高级框架C聚焦高性能应用 / 游戏 / 中间件依赖标准库 专业框架Qt/BoostPython聚焦数据分析 / AI/Web/ 自动化依赖丰富第三方库 高层框架开发效率优先。

更多文章