是不是因为C ++包含了所有东西而不需要学习C?

我在C ++程序devise课上讲课,教授告诉我们没有必要学习C语言,因为C ++包含了C语言和面向对象的特性。 不过,也有人告诉我这不一定是真的。 任何人都可以点亮这个?

概述:

C ++是C的超集,而你的教授是正确的,因为不需要单独学习C。

C ++增加了整个面向对象方面,generics编程方面,以及不太严格的规则(如每个函数顶部需要声明的variables)。 C ++确实改变了C中某些术语的定义,比如结构体,尽pipe仍然是以超集的方式。

为什么它不是一个严格的超集的例子:

这个维基百科文章有这样一个区别的几个很好的例子:

一个常见的差异是C允许从void *到其他指针types的隐式转换,但是C ++不允许。 所以,以下是有效的C代码:

int *i = malloc(sizeof(int) * 5); 

…但为了使它在C和C ++中都能正常工作,需要使用显式的强制转换:

 int *i = (int *) malloc(sizeof(int) * 5) 

另一个常见的可移植性问题是C ++定义了许多新的关键字,例如new和class,它们可以在C程序中用作标识符(例如variables名称)。

这个维基百科文章还有进一步的差异:

C ++编译器禁止跨越初始化,如以下C99代码所示:

  void fn(void) { goto flack; int i = 1; flack: ; } 

你应该先学什么?

你应该首先学习C ++,而不是因为先学习C会伤害你,不是因为你不得不放弃任何东西(你不会),而是因为先学习C没有任何好处。 无论如何,你最终会学习C的一切,因为它或多或less都包含在C ++中。

虽然C ++的devise是为了与C保持高度的兼容性,而C ++中学习的一部分将适用于C,但思维方式却完全不同。 用Boost或STL编程C ++是一种非常不同于C编程的经验。

有一个叫C ++的术语叫做更好的C.这意味着使用一些C ++语言特性和工具来简化C编程(例如,在for语句中声明for循环的索引variables)。 但是现在,现在的C ++开发与C不同,除了大量的语法之外,在这些情况下,C遗留通常似乎是一个负担,而不是一个好处。

如果你知道C ++的语法,那么你不需要学习C的语法,但是你肯定需要学习C语言中的编码实践与C ++中的不同。

所以你的教授不是100%正确的。
在C中,您没有将代码安排到逻辑模块中的类,并且没有C ++多态性。 但是你仍然需要以某种方式实现这些目标。
虽然C的语法在某种程度上是C ++的一个子集,但C 编程不是C ++ 编程的一个子集。 它是完全不同的。

是和不是。

正如其他人已经回答的那样,C ++语言是C语言的超集,除了一些小例外,例如sizeof('x')给出了不同的值。

但是我不认为已经非常明确的说到,在使用这两种语言时,C ++不是超集,而是不同的。 C ++包含新的(可以讨论它们是否更好)的方法来做基本的事情,比如写入屏幕。 旧的C方式仍然存在,但是你通常使用新的方式。 这意味着一个简单的“hello world”程序在C和C ++中看起来不同。 所以,在C和C ++中简单的事情是一样的,然后在C ++中添加更多高级的东西,比如对面向对象编程的支持。

所以如果你已经学过C ++,那么在你用C语言编程之前,你需要重新学习很多东西。(也许可以教C ++作为C的扩展,仍然使用printf和malloc来代替iostream和new,然后添加类和其他C ++的东西,但这种使用C ++的方式通常是皱眉。)

没有C ++不是真正的C超集。如果你感兴趣的话,你可以查看这篇文章中更多的差异列表: http : //en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

不完全正确。

最大的问题就是打字 – C ++的打字types要比C打的强得多,用C ++解决这个问题的首选方法在C中是不可用的。也就是说,你可以在Ctypes(特别是指针types) ,但不在C ++中。 而且C ++ 强烈build议使用static_cast / reinterpret_cast / const_cast方法来解决这些问题。

更重要的是,如果你学习C ++的语法和习惯,你可能会发现很难处理C(有人可能会说这是好的;我更喜欢C ++,但有时候它不是一个选项,或者你必须处理C语言而不是C ++的遗留代码)。 同样,你遇到的最可能的问题是处理指针(特别是char *和通用数组的使用;在C ++中使用std :: string和std :: vector或其他集合更好 )。

学习C ++肯定是可能的,然后学习C和C ++之间的差异,并且能够同时编程。 但差异远远不止是皮肤深层。

确实,对于大多数目的来说,C ++包含了C所做的一切。 语言律师会很快指出,有一些非常特殊的边缘案例是有效的C但不是有效的C ++。

一个这样的例子可能是C声明

 int virtual; 

它声明了一个名为“virtual”的整数。 由于“虚拟”是C ++中的关键字,因此这是无效的C ++。

C(特别是C89)和C ++有一个很大的共同核心,但是C和C ++之间肯定有区别。 很明显,C ++具有所有面向对象的特性,加上generics编程,加上exception,还有C没有的名称空间。 然而,C语言中还有一些C ++中没有的function,如支持(接近古老的)非原型符号来声明和定义函数。 特别是下面的函数声明在C和C ++中的含义是不同的:

 extern void function(); 

在C ++中,这是一个函数,它不返回任何值,也不带任何参数(因此,仅仅为了副作用而被调用,无论它们是什么)。 在C中,这是一个函数,它不返回任何值,但是没有关于参数列表的信息。 在函数调用之前,C仍然不需要声明范围(一般来说,如果函数需要一个variables列表参数,则必须在范围内声明,因此在使用printf()之前对#include <stdio.h>至关重要printf()等)。

也有差异:

 sizeof('c') 

在C ++中,答案是1; 在C中,答案通常是4(具有8位字符的32位系统)或甚至8(具有64位int的64位系统)。

一般来说,你可以编写能够在C和C ++编译器下编译的代码,而不会有太大的困难 – 我的大部分代码都是这么做的。 例外情况是由于我的粗心大意,或者是因为我有意识地利用了C99中不在C ++ 98中的优秀特性(例如指定的初始值设定项或long long

Stroustrup自己首先反对学习C语言。 但是,他(和他那一代人)又一次成功地从C开始成为C ++大师。

我个人会不同意你的教授。

一般来说,C ++是基于C语言的,“sense”包含它并对其进行扩展。

然而,由于传统上人们学习C语言,只能使用C ++的扩展,所以教授的陈述是不正确的,因为正确使用C ++,你需要掌握C语言的起源。 教授你的东西时,你的教授或者教科书可能不会特别提到哪种语言来自什么。

另外,理解尽pipe有相似之处,并不是每个C程序都在C ++下以相同的方式运行。 例如,C ++编译器对C结构的解释是不同的(就像所有的类一样)。

当我教,我先教C语言核心,然后去C ++。

如果class上的任何一个学生都想成为embedded式软件工程师,那么他们别无select,只能用C编程(参见这个问题 , 这个问题等等)。

当然,学习C ++对于他们来说可能不是一个过渡,而是从头开始 – 但是这仍然会让你的教授的陈述变得不真实!