C/C++ 是一种语言还是两种语言?

Is C/C++ one language or two languages?

提问人:Scott O'Donnell 提问时间:1/15/2013 最后编辑:fredoverflowScott O'Donnell 更新时间:6/29/2018 访问量:5180

问:

C/C++ 是一种语言还是两种语言?我听说 C++ 只是带有类的 C。是吗?

C C C++-常见问题

评论

20赞 zneak 1/15/2013
伙计们,这不太好。这个问题可能可以通过谷歌搜索来回答,但你需要冷静下来。你真的需要辨别恶意提出的问题和编程新手提出的问题。
4赞 Mysticial 1/15/2013
@BenjaminLindley 正式术语是“Clean C”。
3赞 Benjamin Lindley 1/15/2013
@Mysticial:我不确定是什么让它成为正式术语。这只是某本书中使用的术语。这个名字当然没有明确说明意思。如果我正在编写使用可变长度数组的 C 代码,以及其他非常好的功能,我的代码不是“干净的 C”吗?restrict
15赞 Adam Lear 1/15/2013
我认为@zneak在这里提出了一个重要的观点。这可能是一个初学者的问题,对于每个有一点经验的人来说似乎都是显而易见的,但它肯定不是一个“可能引起辩论、争论、民意调查或扩展讨论”的问题。IMO 没有必要关闭它。
27赞 Jerry Coffin 1/15/2013
实际上,是一个表达式(在 C 和 C++ 中都具有未定义的行为,因为它修改 C 尝试使用其值,而没有中间序列点)。C/C++

答:

23赞 Hogan 1/15/2013 #1

它是两种语言。将 C++ 称为“带类的 C”就像称大象为四足动物一样。这似乎是真的,直到你把它比作鼠标。

有许多语言源自C:C++,Java,C#,JavaScript,csh,列表还在继续。它们在许多方面都不同,但它们具有相似的语法。

当然,C 源自 B。但那是另一回事了(没有人再关心B了。

评论

1赞 zneak 1/15/2013
尽管这很有趣,但我不认为这是你能得到的最有启发性的答案。
6赞 Lightness Races in Orbit 1/15/2013
@zneak:到目前为止,你对这个问题的贡献是(a)抱怨评论,(b)抱怨答案。愿意提供“有指导意义的答案”吗?
2赞 zneak 1/15/2013
@LightnessRacesinOrbit,在 Potatoswatter 的完全正确的回答之后,我没有理由这样做。
2赞 1/15/2013
(我什至没有听到小鹿从我头上飞过......
5赞 Hogan 1/15/2013
@pst - Mouselephant...对我来说,这听起来像是 JavaScript。
36赞 Lightness Races in Orbit 1/15/2013 #2

“C/C++”恰好是零语言。它不存在。

另一方面,C 是一种语言。

C++是另一种语言,它有点像C,但也有类和许多其他差异


需要明确的是,@Zoidberg是正确的:

C 和 C++ 是两种完全不同的语言。C with Classes是C++的前身,但该术语仍然经常用于非现代C++(例如,到处使用原始指针)。

68赞 Potatoswatter 1/15/2013 #3

C++在1982-1983年与C分道扬镳,这在计算机时代是很长一段时间。但是,有许多兼容 C++ 的 C 库,包括 C 标准库本身,并且有源源不断的程序从 C 移植到 C++。许多 C 程序员只知道或使用与 C++ 兼容的功能。

它们由来自不同委员会的不同 ISO 标准定义。即使他们定义了兼容的功能,也经常用不同的术语来定义。

引用 C/C++ 与引用意大利语/西班牙语一样有效。您应该小心使用此类术语的对象和时间。但确实存在两个方向的思想传播,而且相似之处不仅仅是巧合。

评论

0赞 Potatoswatter 1/15/2013
@BoPersson呵呵,我没有真正验证过。但是委员会非常大,共同的成员很少。
0赞 HonkyTonk 1/15/2013
在九十年代初,C++委员会的一些想法被C委员会采纳,因此在语言开发方面有一些互动。这就是人们在考虑语言历史时所期望的。
0赞 Potatoswatter 1/15/2013
@HonkyTonk 在 2010 年代初期,C++采用了 Java 的一些想法(基于范围)。所有语言都混合在一起。可能我应该提到兼容性功能,例如 C 样式转换和宏 ,但这些都是细节。相互兼容性是次要问题,尽管它确实被考虑在内。但是,C++ 将始终支持 C 标准库,所以......这个答案确实可以扩展。foroffsetof
0赞 Chef Gladiator 8/1/2021
我敢澄清:编程语言是在文档中定义的。在这种情况下,C 和 C++ 是两种不同的编程语言。输入运行时,清晰度就会丢失。输入 ABI,C 是生活在下面并统治他们所有人的野兽。
12赞 KamikazeCZ 1/15/2013 #4

简单答案:两种语言

它们是两种不同的语言,尽管几乎任何 C 代码都是有效(不一定是好的)C++ 代码。

C++ 最初被认为是“C,但有类”,但随着时间的推移,它越来越不同,现在 C 代码是非常糟糕的 C++ 代码。你可以学习 C 或 C++ 或两者兼而有之,但你通常不会将它们混为一谈(但你可以)。

评论

4赞 Lightness Races in Orbit 1/15/2013
在这种情况下,“代码”是一个不可数的名词,因此,“代码”是不正确的。
0赞 Jasen 6/22/2018
typedef struct foo {int a} foo;是有效的 C++ ??大多数重要的 C 代码都有类似的东西。
4赞 user1944429 1/15/2013 #5

C/C++ 是两种语言。C 是一种语言,C++ 是另一种语言。C++被认为是“更好”的C.C是过程的,而C++是面向对象的。C++ 比 C 有很多改进,并且具有与 C 类似的语法。

评论

4赞 Mac 1/15/2013
我会小心:我想周围有很多人认为 C++ 更像是 C 的混蛋腐败,而不是“更好的 C”。其中大多数可能是 VB.net 无法区分的程序员。我不是其中之一。:)
6赞 Ulrich Eckhardt 1/15/2013
C++ 不是面向对象的语言。它确实支持面向对象编程,但也支持一些其他范式,如过程编程和函数式编程。哦,你也可以用 C 语言做 OOP,只是它相当笨拙。
0赞 1/15/2013
我想这是一个很好的观点。我总是称它为面向对象的编程语言,因为在我看来,如果你不把它当作OO使用,你就用错了。但你是对的。
1赞 UTHM2012 1/16/2013 #6

恕我直言,我认为答案是 C/C++ 不是一种语言,而是两种语言:

  • C 编程语言
  • C++ 编程语言

C++ 语言派生自 C 语言。C++ 是添加了“类”功能的 C 编程语言的名称。这意味着基本的 C 语言架构已经得到增强,允许面向对象编程。它使用表示增量的“++”运算符。C++ 是 C 的增量,它允许您在编程方式中使用过程方式或面向对象方式或两者兼而有之。C++ 允许我们编写比 C 更容易的代码。但这并不意味着C语言现在不适合,因为我们有C++。每种语言都用于程序员所需的软件的目标。这就是 ANSI 将 C 作为标准的原因。

参考

4赞 taocp 1/16/2013 #7

它们是两种不同的语言。C++之所以如此命名,是因为它的一部分植根于C,并且在某种意义上与C兼容。

根据Scott Myers的Effective C++,我们可以将C++视为具有以下4个组件的统一语言:

  1. C 语言部分、块、语句、预处理器等
  2. 面向对象的 C++:包括类、封装、继承、多态性等
  3. 模板 C++:包括 C++ 模板、元编程内容
  4. The STL.

因此,从某种意义上说,C++ 比 C 更强大。

2赞 Brent Bradburn 6/4/2015 #8

“C”这个名字指的是一系列相关语言,其中一些被正式化为国际标准。这些包括K&R C,ANSI C,C99和C11

“C++”这个名字指的是一系列相关语言,其中一些被正式化为国际标准。这些包括 C++98、C++03C++11C++14、 以及推测的 C++17

许多人使用术语“C/C++”来非正式地指代 C 和 C++ 的交集,这是由 C++ 的设计者有意维护的。

C++的前身实际上最初被称为“C与类”。Bjarne Stroustrup 1994 年出版的《C++的设计与演变》一书中对此进行了详细描述。这个名字最终被改为“C++”,主要是出于对C社区的礼貌,因为人们把“C with Classes”缩短为“C”或“新C”太诱人了。

C++ 中有许多语言功能不是 C 语言的(反之亦然)。特别是,基于类的模型,由于其调用隐式函数调用的能力,非常强大,以至于 C++ 已经(相当有机地)发展了更高级别的编程风格,这使得 C++ 的典型用法与 C 的典型用法大不相同。最值得注意的例子是与“资源获取即初始化”的概念相关联,该概念体现在标准类 stringvectorshared_ptr 以及标准 I/O 库的流类中。

其他说明:

评论

3赞 Keith Thompson 6/5/2015
许多人使用术语“C/C++”来非正式地指代 C 和 C++ 的交集。根据我的经验,大多数使用术语“C/C++”的人并不是指两种语言的交集。在大多数情况下,这表明作者不了解 C 和 C++ 之间的关系,并且可能无法描述它们之间的“交集”。从这个意义上说,它可能是一个有用的标志。
0赞 Brent Bradburn 6/5/2015
@KeithThompson:也许你所指的人试图“指代十字路口”,即使他们不知道那是什么。仅仅因为某人不能完美地定义某事,并不意味着他们不能尝试讨论它。我想在某种上下文中,“C/C++”可以用来表示“C 或 C++,但不一定两者兼而有之”。在这种情况下,他们可能想要的是与 C++ 编译器一起使用的东西,但如果它也适用于 C 编译器(甚至可能相反),他们就可以了。
1赞 Keith Thompson 6/5/2015
这可能取决于他们在寻找什么。如果招聘人员说他正在寻找“C/C++”程序员,他可能正在寻找 C 程序员和/或 C++ 程序员,而不是(不一定)能够在 C 和 C++ 的交叉点上编写程序的程序员。