是真的,因为C ++包含了所有内容,所以不需要学习C吗?
我正在上一门C ++编程课程,这位教授告诉我们,无需学习C,因为C ++包含C语言中的所有内容以及面向对象的功能。但是,另一些人告诉我,这不一定是正确的。谁能对此有所启发?
解决方案
概述:
C ++是C的超集,这是几乎正确的,而教授是正确的,因为我们无需单独学习C。
C ++增加了整个面向对象的方面,通用编程方面以及不那么严格的规则(例如,需要在每个函数顶部声明变量)。 C ++确实会更改C中某些术语(如结构)的定义,尽管仍采用超集方式。
为什么它不是严格的超集的示例:
这篇Wikipedia文章有几个很好的例子说明了这种区别:
One commonly encountered difference is that C allows implicit conversion from void* to other pointer types, but C++ does not. So, the following is valid C code: int *i = malloc(sizeof(int) * 5); ... but to make it work in both C and C++ one would need to use an explicit cast: int *i = (int *) malloc(sizeof(int) * 5) Another common portability issue is that C++ defines many new keywords, such as new and class, that may be used as identifiers (e.g. variable names) in a C program.
这篇Wikipedia文章也有更多区别:
C++ compilers prohibit goto from crossing an initialization, as in the following C99 code:
void fn(void) { goto flack; int i = 1; flack: ; }
我们应该首先学习什么?
我们应该首先学习C ++,不是因为首先学习C会伤害我们,不是因为我们将不得不学任何东西(我们不会),而是因为先学习C没有好处。无论如何,我们最终都会学习有关C的所有知识,因为C或者多或者少都包含了C。
的确,对于大多数目的,C ++包含C所做的一切。语言律师会很快指出,存在一些非常特殊的边缘情况,它们是有效的C但不是有效的C ++。
一个这样的例子可能是C声明
int virtual;
声明一个名为" virtual"的整数。由于"虚拟"是C ++中的关键字,因此这不是有效的C ++。
我个人不同意你的教授。
一般来说,C ++是基于C的,并且"感觉"包含并扩展了它。
但是,由于传统上人们是学习C语言的,然后才学习C ++的扩展,因此教授的说法是错误的,因为要正确使用C ++,我们需要掌握C的起源。在教我们一些内容时,教授或者教科书可能不会特别提及来自哪种语言的内容。
此外,重要的是要理解,尽管有很多相似之处,但并不是每个C程序都在C ++下以相同的方式运行。例如,C ++编译器对C结构的解释不同(作为具有所有公共内容的类)。
当我教书时,我首先教C核,然后讲C ++。
没有C ++并不是C的真正超集。如果我们感兴趣,可以查看本文以获取更多差异的清单:
http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B
确实,C ++旨在保持与C的高度兼容性,并且我们在C ++中学到的内容的一部分将适用于C,但这种思维方式是完全不同的。使用Boost或者STL进行C ++编程与使用C进行编程的体验截然不同。
有一种术语称为使用C ++作为更好的C。这意味着使用一些C ++语言功能和工具可以简化C编程(例如,在for语句中声明for循环的索引变量)。但是现在,现代C ++开发似乎与C有了很大的不同,除了语法上有很多不同之外,在这种情况下,C遗留的内容似乎常常是负担而不是收益。
C(特别是C89)和C ++有一个很大的共同核心,但是C和C ++之间肯定存在差异。显然,C ++具有所有面向对象的功能,通用编程,异常以及C所没有的名称空间。但是,C还具有C ++中没有的功能,例如支持(接近古老的)非原型表示法来声明和定义函数。特别是,以下函数声明的含义在C和C ++中是不同的:
extern void function();
在C ++中,该函数不返回任何值且不接受任何参数(因此,仅因其副作用而被调用,无论它们是什么)。在C语言中,该函数不返回任何值,但不包含有关参数列表的信息。在调用函数之前,C仍然不需要在范围内进行声明(通常;如果函数接受变量的变量列表,则必须在范围内进行声明,因此在使用#include <stdio.h>之前至关重要)使用printf()
等)。
也有区别:
sizeof('c')
在C ++中,答案是1;答案是1. 在C语言中,答案通常是4(具有8位字符的32位系统)或者什至8(具有64位int的64位系统)。
通常,我们可以编写可以在C和C ++编译器下进行编译的代码,而我的大部分代码始终都可以轻松完成。异常是由于我的粗心大意造成的,或者是因为我有意识地利用了C99中C99所没有的良好功能,例如指定的初始化程序或者" long long"。
并非完全正确。
最大的"陷阱"是键入-C ++的类型比C要强得多,而在C ++中解决此问题的首选方法根本无法在C中使用。也就是说,我们可以在C中的类型(尤其是指针类型)之间进行静默转换,但不是在C ++中。 C ++强烈建议使用static_cast / reinterpret_cast / const_cast方法来解决这些问题。
更重要的是,如果我们学习C ++语法和习惯,我们可能会发现很难使用C(有人可能说这很好;我自己更喜欢C ++,但有时这不是一个选择,或者我们必须处理使用C而不是C ++的旧代码)。同样,我们将遇到的最可能的问题是处理指针(特别是char *和常规数组的用法;在C ++中,使用std :: string和std :: vector或者其他集合会更好)。
当然有可能学习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 ++的人,与其说是从头开始,不如说是过渡,但这仍然使教授的说法不正确!
Stroustrup自己建议不要先学习C。但是话又说回来,他(以及他这一代人)设法从C开始成为一名C ++专家。