不要再用 C/C++ 的这种说法了!

b910d435343dc5b71da1cf9f25213f08.gif

我们对“C/C++”这种写法或说法似乎在无形之中早已习以为常,然而,这种做法真的是对的吗?

在今天这篇文章中,有开发者呼吁应该立即停止使用“C/C++”这种说法,因为这属于两种完全不同的编程语言,以下是他解释的原因。

原文:https://brycevandegrift.xyz/blog/stop-saying-c-and-c++/

编译 | ChatGPT

责编 | 苏宓

出品 | CSDN(ID:CSDNnews)

在我记忆中,每当有人提到用 C 或 C++ 编写的项目时,他们常常都会用 C/C++ 这样的说法。对于那些从未接触过 C 或 C++ 的大多数人来说,这可能看起来并不是什么大问题。

然而,问题在于当人们使用这个术语(C/C++)时,他们让 C 和 C++ 看起来像是相似或密切相关的编程语言。

事实并非如此。尽管 C++ 最初是基于 C 创建的,但随着时间的推移,这两种语言已经越来越不相似,并且在许多方面也存在差异。因此,建议停止使用"C/C++"这样的说法,而是明确指出是 C 还是 C++,以避免混淆和误导。

2a563ffcd095da0ef8eef15bfd7c4330.png

C 和 C++ 非常不同

可能会有人说:“嗯,你可以在 C++ 程序中编写 C 代码,所以从技术上讲,C是 C++ 的一个子集。”

但事实上,许多其他编程语言(如 Zig、Go、Nim 等)也可以编写 C 代码,并且几乎所有其他语言都有与 C 的互操作性。

因此,如果仅仅因为可以在 C++ 中使用 C 代码,就将 C 称为 C++ 的子集,那么同样的逻辑也可以应用到其他语言上,是否应该把 Zig、Go 和 Nim 称为 C/Zig、C/Go 和 C/Nim 呢?

显然这种做法不合适。

带有类的 C 语言

有人曾说,“C++ 只是带有类的 C 语言!”

其实说这句话的人显然从未使用过 C++。C++ 具有与 C 语言不同的标准库、实现。在最初开发 C++ 时,它只是在 C 语言的基础上添加了类的特性,但自那时起,C++ 已经实现了与 C 语言不同的功能。

不兼容性

空指针 

C++ 与 C 不兼容的一个例子是空指针的处理。例如,下面这段程序可以使用 C 编译器(如 GCC)进行编译,但无法使用 C++ 编译器(如G++)进行编译:

#include <stdlib.h>int main() {int *a = malloc(5);return 0;
}

这段代码只是给一个整数指针 a 分配了 5 个字节的内存。当使用 GCC 编译这个程序时,它可以正常运行,但如果使用 G++ 编译这个程序,就会返回以下错误:

main.c: In function 'int main()':
main.c:4:24: error: invalid conversion from 'void*' to 'int*' [-fpermissive]4 |         int *a = malloc(5);|                  ~~~~~~^~~|                        ||                        void*

发生这种情况的原因是 malloc 函数返回一个空指针(void pointer),而 C++ 不能将空指针直接转换为整数指针,除非它明确地转换为整数指针。

K&R 语法

C++ 与 C之间的另一个重要不兼容性是 C++ 实际上与 K&R 语法不兼容。以下以 K&R 语法书写的函数为例:

int gcd(a, b)int a;int b;
{if (b == 0)return a;return gcd(b, (a % b));
}

使用 GCC 编译时,它会完美地编译通过(如预期的那样),然而使用 G++ 编译时,会出现另一组错误。

gcd.c:3:9: error: 'a' was not declared in this scope3 | int gcd(a, b)|         ^
gcd.c:3:12: error: 'b' was not declared in this scope3 | int gcd(a, b)|            ^
gcd.c:3:13: error: expression list treated as compound expression in initializer [-fpermissive]3 | int gcd(a, b)|             ^
gcd.c:6:1: error: expected unqualified-id before '{' token6 | {| ^

这使得在 C++ 中使用 K&R 语法几乎不可能,除非你按照 ASCII C 的格式编写函数参数。(我知道很少有人关注 K&R 语法,但我认为这仍然是一个重要的区别)。

还有许多其他在 C 中无法转移到 C++ 的内容,例如复数、默认返回类型等等,但我认为你已经对此有所了解了。如果让 C 与 C++ 一起使用时,这些不兼容性并不会破坏整个 C 语言,但这些小差异会逐渐累积。

对初学者来说很困难

不区分 C 和 C++ 还会产生排斥新用户的副作用。许多初学者程序员被“C/C++”这个术语引导,认为它们基本上是相同的语言。另外,也有许多教程被标榜为“C/C++教程”,进一步加深了混淆。

这也可能使 C 初学者退避三舍,让他们认为要理解 C 必须先理解 C++ 的复杂性(这实则完全没必要)。我以前也曾陷入这个陷阱,还有很多其他人。C 实际上是一种非常简单的编程语言,而 C++ 则不是。

f111c59ac19a200855f1af31d2454fe4.png

C 和 C++ 程序员非常不同

随着年复一年引入的新的 C++ 标准,如 C++11、C++20 等,C++ 程序员获得了更多在标准 C 中不存在的工具和函数。这通常导致现代 C 程序比现代 C++ 程序具有更多的代码行数,然而这意味着现代 C 通常比现代 C++ 更易读。

以下是来自 LeetCode 的一个示例问题。解决方案可能不同,但大多数 C 语言的解决方案看起来像这样:

int maximumCount(int *nums, int numsSize) {int pos = 0, neg = 0;for (int i = 0; i < numsSize; i++) {if (nums[i] > 0) pos++;else if (nums[i] < 0) neg ++;}return pos > neg ? pos : neg;
}

尽管这段代码对于 C 标准来说是相当紧凑的,但它仍然是非常可读的。现在说说 C++ 的解决方案,这个方案有很多变化,所以我将使用一个与 C 足够不同的方案。

int maximumCount(std::vector<int> nums) {
auto [a, b] = std::equal_range(nums.begin(), nums.end(), 0);
return std::max(std::distance(nums.begin(), a), std::distance(b, nums.end()));
}

这使用了 C++ 标准库中的 vector 和算法。正如你所看到的,这段代码要紧凑得多,但绝对没有 C 语言代码的可读性。尽管 C 语言的解决方案可以被 C++ 编译器编译,但我想强调的是它们之间的差异有多大。这只是一个例子,说明 C 和 C++ 程序员在编程方面已经慢慢分离。

2cecb085695ec2baceea51b1aa2ab223.png

许多 C 程序员不愿意接触 C++

我很确定现在每个人都知道 C 程序员的刻板印象,唯一的问题是它是真实的。很多 Suckless 用户和开发者在他们的程序中只使用 C 和 POSIX shell。Cat-v 认可 C 和类 C 语言,但鄙视 C++。即使是 Linux 和 Git 的创造者 Linus Torvalds,也不愿意碰 C++。

如果雇主只想寻找 C 语言开发人员,那么他们更不应该把 C/C++ 放在工作描述中,如果这样做,他们只会吓跑有能力的 C 语言开发者。

eca33a3c5c9a156c743dbd53184ce325.png

613b16d78d46d64fff12c3a778bf8bc5.png

解决方案

如果你指的是 C 语言程序或程序员,就说 "C"。如果你指的是一个 C++ 程序或程序员,就说 "C++"。如果你指的是两者分开使用,就说类似的东西:

  • C 和 C++

  • C,C++

  • C++ 与 C

  • 等等

千万不要写——C/C++。

只有当你将 C 和 C++ 一起使用时,才可以说是C/C++。

推荐阅读:

▶10 年 Android 开发者突遭谷歌封号:“从此放弃,并决定开源所有应用!”

▶教授误用 ChatGPT 来论文“查重”,学生:不仅挂科了,我差点拿不了毕业证!

▶ChatGPT App 来了!

017a120ade728b7a1bc2335acef67099.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42306.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真正的Python多线程来了!

【CSDN 编者按】IBM工程师Martin Heinz发文表示&#xff0c;Python即将迎来了真正的多线程时刻&#xff01; 原文&#xff1a;https://martinheinz.dev/blog/97 未经授权&#xff0c;禁止转载&#xff01; 作者 | Martin Heinz 责编 | 梦依丹 翻译工具 | ChatGPT 32岁的Python…

Circular lollipop | 哇咔咔!!!环形棒棒糖图好吃又好玩!~

1写在前面 今天不想废话了&#xff0c;直接看图吧。&#x1f447; 复现代码step by step&#xff0c;自己看吧。&#x1f92a; 2用到的包 rm(list ls())library(tidyverse)library(ggtext)library(patchwork) 3示例数据 df_pw <- read.csv("./passwords.csv",row…

最新突破!天然产物首次实现全合成,轰动整个化学界

01 科研背景 生物医学是综合医学、生命科学和生物学的理论和方法而发展起来的前沿交叉学科,基本任务是运用生物学及工程技术手段研究和解决生命科学&#xff0c;特别是医学中的有关问题。机器学习技术能利用复杂的算法在大规模、异质性数据集中进行运行,在生物医学方面、人类…

基于人工智能与机器学习等多种方法的研究内容

导语 生物医学是综合医学、生命科学和生物学的理论和方法而发展起来的前沿交叉学科,基本任务是运用生物学及工程技术手段研究和解决生命科学&#xff0c;特别是医学中的有关问题。机器学习技术能利用复杂的算法在大规模、异质性数据集中进行运行,在生物医学方面、人类基因组项…

《简说基因》公众号编辑招募公告

【简说基因】免费交流群&#xff0c;资料领取/学习交流 生物信息学是什么&#xff1f;看一看 ChatGPT 的回答&#xff1a; 生物信息学是一个跨学科领域&#xff0c;结合了生物学和计算机科学的原理和技术&#xff0c;旨在研究和解释生物学数据。它利用计算机算法和统计方法来分…

挖呀挖!AutoDock 分子对接极简实践方法

挖呀挖&#xff01;AutoDock 分子对接极简实践方法&#x1f44b; 哈哈哈 开心&#x1f606; 在小小的花园里面挖呀挖呀挖 &#x1f331; 种下一颗小小的种子&#x1fad8; 开出一朵小小的花&#x1f338; 在大大的花园里面挖呀挖呀挖&#x1f331; 种下一颗大大的种子&#x1f…

【TOP生物信息】CNS图表复现,单细胞marker基因展示的另一种方式——蜂巢图

扫码关注下方公粽号&#xff0c;回复推文合集&#xff0c;获取400页单细胞学习资源&#xff01; 本文共计1359字&#xff0c;阅读大约需要4分钟。 Sten Linnarsson大神的单细胞绘图堪称极致美学&#xff0c;在这里&#xff0c;小编选择了发表在nature上展示marker基因的绘图进…

【Vue2从入门到精通】深入浅出,带你彻底搞懂Vue2组件通信的9种方式

文章目录 人工智能福利文章Vue组件间通信分类1.props / $emit1.1 父组件向子组件传值1.2 子组件向父组件传值 2.$parent / $children3.ref / $refs3.1 ref作用于组件3.2 ref作用于Html标签3.3 $nextTick() 4.EventBus &#xff08;$emit / $on&#xff09;4.1 初始化4.2 发送事…

三国鼎立:ChatGPT、百度文心一言、微软 New Bing

推荐国内可访问chatGPT: chatGTP --------------------------------------------------------------------------------------------------------------- ChatGTP&#xff1a;更像是三国中魏国&#xff0c;地大物博用户多。 百度文心一言&#xff1a;更像是三国中的蜀国&…

在Mac中设置Ctrl+C/V进行复制/粘贴

在win环境转到mac环境,感觉最大的就是这个⌘键了,看了很多帖子感觉都是片面的 进行系统偏好设置 > 键盘 > 快捷键 > App快捷键点击如图加号 这一步很重要,比如你要修改访达的复制粘贴,那就代打开访达 根据访达的编辑一栏自定义修改 菜单标题就是 全选 键盘快捷键自…

如何在Mac上复制和粘贴

如果您是具有Windows PC背景的新Mac用户&#xff0c;则可能想知道如何在macOS中使用典型的复制和粘贴命令。 在Windows中&#xff0c;“复制”和“粘贴”键组合分别为Control-C和Control-V。在Mac上&#xff0c;这非常相似–您要做的就是使用Command&#xff08;⌘&#xff09;…

mac截图复制到剪贴板_如何一次将多个内容复制到Mac的剪贴板中

mac截图复制到剪贴板 You know that thing where you copy something important, forget to paste it anywhere, then copy something else? It sucks, because the important thing you copied first is gone. 您知道要复制重要内容的东西&#xff0c;忘记将其粘贴到任何地方…

Mac复制改为拷贝

在默认情况下&#xff0c;mac电脑的复制为复制粘贴&#xff0c;即会生成一个副本文件&#xff0c;并没有达到Win下复制功效。 不知你是否遇到过&#xff0c;下面贴图介绍如何调整为真正的复制功能。 1.打开 系统偏好设置 2.选择 键盘 3.快捷键-App快捷键 然后删除 复制 快捷键…

Mac mini 使用普通键盘设置 Windows 的粘贴、复制、剪切习惯

问题描述 通常我们会习惯性用左手小拇指按最左下角的 ctrl 键作为功能前缀键&#xff0c;进行复制、粘贴、剪切等操作&#xff0c;但将普通键盘接到 macOS 设备上&#xff0c;会将 windows 徽标键视为 command 键&#xff0c;此时习惯了 Windows 系统的朋友进行复制、粘贴、剪…

mac item2 复制会话session

按照如下图红框内设置 Command中输入ssh 常登陆的ip&#xff08;如果不配置这一步则复制session时还要自己输入ssh命令&#xff0c;只是不需要输入密码而已&#xff09; 在自己的mac终端, vim ~/.ssh/config 添加 host *ControlMaster autoControlPath ~/.ssh/master-%r%h:…

WindowsMac剪贴板如何存储多条复制记录

Windows版 1.第一步点击电脑左下方“开始菜单”按钮。 2..点击 “设置”按钮。 3.打开设置之后点击"系统"。 4.然后下拉找到“剪贴板”。 5.选中剪贴板&#xff0c;然后在右侧即可开启剪贴板历史记录功能。 按“WindowsV”组合键键即可打开剪贴板。复制或者剪切过的…

五个最好的复制/粘贴的Mac App应用

如果你刚用Mac&#xff0c;之前是用Windows电脑的&#xff0c;第一个问题就会发现&#xff0c;Mac上的复制/粘贴找不到了。如果你也有同样的问题&#xff0c;或者你在找Mac上有没有好用的剪贴板管理工具&#xff0c;可以在下面的文章中找到答案。 Mac上怎样优雅的复制/粘贴 c…

Mac简单易用的复制软件——“TouchCopy”

TouchCopy是Mac平台上一款简单易用的复制软件&#xff0c;可以轻松的将你的照片、视频、通讯录、文档、日历复制到pc端或者是磁盘里。有需要的朋友欢迎前来macdown下载体验&#xff01; 功能 1、将音乐从iPhone / iPod / iPad传输到iTunes将音乐从iPod或iOS设备复制到PC或Mac硬…

苹果Mac电脑的复制粘贴不能用了

复制 (⌘ C) 和粘贴 (⌘ V) 是使用Mac电脑过程中遇到频率非常高的快捷组合键&#xff0c;突然你发现它们不能使用了&#xff0c;会非常崩溃。macw小编今天为大家带来详细解决办法&#xff0c;让您的复制粘贴重新启用起来&#xff01; 为什么 Mac 剪贴板不起作用 我们在 Mac…

Mac下iterm2 克隆会话功能

因为每次需要先登录跳转机&#xff0c;再登录开发机&#xff0c;输入两次密码&#xff0c;过于繁琐&#xff0c;所以上网找了iterm下克隆会话功能。 网上说command下的command也要配置&#xff0c;亲测不用&#xff0c;只选中下面的reuse previous sessions’s directory就行。…