作为一个想要提高他的基本编程技能的人,我选择学习C++而不是C.这引出了我的问题:我在C中留下的任何基本技能是否可能无法通过学习C++获得?
相关问题: 在学习C++之前我应该学习C吗?
如果你曾经使用的是面向对象的编程语言,比如C++,那么练习一点C是值得的.我发现许多OO程序员倾向于使用像拐杖一样的对象而且一旦你拿走就不知道该做什么他们走了.C将让您清楚地理解为什么首先出现OO编程,并帮助您了解何时它的有用与何时只是矫枉过正.
同样,您将了解不依赖图书馆为您做事情的感受.通过了解C++开发人员将哪些功能转换为库,您可以更好地了解如何在时机成熟时抽象自己的代码.只是觉得你需要在每种情况下抽象一切都是不好的.
也就是说,你不需要学习C.如果你了解C++,你可以在大多数项目中自拽.但是,通过查看较低级别的语言,您将改进您的编程风格,即使在更高级别的语言中也是如此.
我不认为你可以用C语言学习任何技能但不能用C++学习,但我肯定建议先学习C语言.没有人能够适应C++; 它可能是有史以来最复杂的非深奥语言.另一方面,C非常简单.将C放入脑中相对容易.C肯定会帮助你比C++更快地习惯指针和手动内存管理.C++将帮助您理解OO.
另外,当我说学习C时,可以使用C++编译器,如果你愿意,也可以使用像iostream这样的东西,只是试着首先将自己局限于大多数C功能.如果你全力以赴并学习所有奇怪的C++特性,如模板,RAII,异常,引用等,你将会彻底搞糊涂.
比较下面的代码示例(道歉,我的C++有点生疏).
C++:
int x; std::cin >> x;
C:
int x; scanf("%d", &x);
那么,你在上面看到了什么?在C++中,将值插入变量中.这很酷,但它教给我们什么?在C中,我们注意到一些事情.x有一个有趣的&在它前面,这意味着它的地址正在传递.这必然意味着scanf函数实际上需要知道内存x在哪里.不仅如此,它还需要一个格式字符串,所以它一定不能真正理解你给它的地址以及它获取信息的格式是什么?
C让您发现所有这些关于计算机和操作系统实际工作的精彩内容,如果您愿意付出努力的话.我觉得这很酷.
肯定有一件事:内存管理.以下代码为例:
struct foo { int bar; char **box; }; struct foo * fooTab = (struct foo *) malloc( sizeof(foo) * 100 ); for(int i = 0; i<100; i++) { fooTab[i].bar = i; fooTab[i].box = (char **) malloc( sizeof(char *) * 10 ); for(int j = 0; j<10; j++) { fooTab[i].box[j] = (char *) malloc( sizeof(char) * 10 ); memset(fooTab[i].box[j], 'x', 10); } }
使用C++,您根本不会以这种方式处理内存分配.结果,这些技能可能没有受过训练.这肯定会导致例如较低的调试技能.另一个缺点可能是:降低优化技能.
C++代码看起来像:
struct foo { int bar; static int idx; vector< vector> box; foo() : bar(idx), box(10) { idx++; for ( auto it = box.begin(); it != box.end(); it++) { it->resize(10,'x'); } } }; int foo::idx = 0; foo fooTab[100];
正如您所看到的,根本无法使用C++样式代码学习原始内存管理.
编辑:通过"C++ - 样式代码"我的意思是:RAII构造函数/析构函数,STL容器.无论如何我可能夸大了,最好说:用C++风格的代码学习原始内存管理要困难得多.