学习C的实用方法?[关闭]


10

我想学习C语言,通常当我想学习一种新语言时,我会想到一个简单/可以达到的项目目标,该目标具有一定的实际用途(使用api,自动执行任务等)。

我很难为C设计一个,主要是因为我阅读的所有内容都表明,C目前主要用于嵌入式系统和更复杂的软件项目(如操作系统)。

这是否表明我不需要学习它,或者我只需要在学习策略上更加困惑?

指实用学习资源?(教程/如何产生具有某些目的/益处的最终结果)


3
如果您能告诉我们您为什么要学习C,您将得到更多明智的答案。
zvrba 2011年

2
我同意zvrba。C非常适合用于低级,快速的内容和驱动程序代码。如果您正在编写游戏代码,那也很棒(尽管,您可能正在与C ++编码器合作,他们会因编写“非标准”代码而抱怨您)。我确实感觉到,尽管Assembly和C与拉丁语类似(在口语中),它们并不是第一个,但是在它们之后的大多数人都是使用它们的思想和构造来创建自己的语言的。因此,学习C MIGHT可以使您更好地理解高级语言
Jamie Taylor

您是否检查过Zed Shaw的Learn C The Hard Way。几乎可以实现,而且也很免费。
怀亚特·巴内特

Python Hard Way的人现在有其他语言的书籍,包括C语言的alpha版本,我将从这里开始。C与asm的差异很大,我讨厌与asm的比较,因为它是错误的。相对确定它可以让您做其他语言不会做的事情。想要制作任何可以用C编写的应用程序都没有关系,没有理由将应用程序定位为该语言。
old_timer 2012年

Answers:


27

我只建议拿起Kernighan和Ritchie的The C Programming Language(第二版)的副本。在每一章的最后,您都可以进行许多练习,并对C语言进行了很好的介绍。它不会使您成为语言的精通者,但是您应该在书和练习的结尾处有足够的了解,以便找到一个用C编写的开源项目,您可以阅读该源代码并做出贡献至。

如果您想查看包含C代码的实际项目。这变得越来越困难-许多项目使用“高级”语言,但是C仍然活跃并且不断发展。如果您想学习C,请不要害怕重新发明轮子以实现学习。每天重新发明解决方案不是一个好主意,但是作为学术练习这样做是完全可以的。


1
从com.lang.c添加FAQ。c-faq.com
迈克·谢里尔

3
+1表示不介意重新发明解决方案以进行学习。
的CVn

4
一般而言,K&R对于学习良好的编程风格感到恐惧,尤其对于教授安全/合理的C编程实践而言,这令人恐惧。里面的所有代码片段充其量都是被混淆的,大多数时候,它们都教导完全的危险习惯。这是一本过时的书,除了怀旧之外,我不会推荐它。它特别不适合初学者。

2
@Thomas是第二版。您可以从中引用几乎所有的代码片段,我很可能会指出其中的2-3个危险/不良实践案例。我现在打开这本书,并随机挑选一些例子。好的,我们在这里,p119:在内部条件中赋值,使用本机原始数据类型,使用隐式int(无符号),类型转换malloc的结果(非常糟糕!),类型转换为free到void *的参数(为什么? ),多个返回值(也就是意大利面条),如果不带{},则使用NULL,而没有正确的#include。

2
+1 for KnRC。这是我读过的特定语言编程的最佳(也是最简洁)介绍。正如其他人所指出的那样,在某些地方可能有点可疑-我要提的一条建议是:如果有编程手册要求您阅读周围的内容,就是这样。通常,您可以从代码块中找出其他人,但是这本书要求您至少从头到尾阅读它一次。
杰米·泰勒

1

您将必须真正了解内存分配。听起来您以前曾经使用过其他语言,但是这些其他语言很可能会向您隐藏内存管理的细节。在C语言中,内存管理始终是显式的。这样做有一些好处,但是这意味着您必须小心正确,否则所有地狱都会崩溃。

使用您所使用的平台可用的任何内存调试功能。对于Linux,有Electric Fence,在Mac OS X上有Guard Malloc。还有Valgrind,它支持多种操作系统。

如果无法释放应释放的内存,则会发生内存泄漏。继续这样做,将耗尽内存。即使使用后备存储(大多数人称之为虚拟内存),也可能导致系统分页过多,甚至耗尽交换空间。

如果释放已经释放的内存,则将破坏堆并崩溃,但可能不会立即崩溃。如果溢出缓冲区,也会破坏堆。内存调试工具将为所有这些提供帮助。

单元测试也有帮助。


0

我同意这里的大多数人的看法,即今天的语言取决于手头的任务。曾经有一段时间,您在这方面的选择有限。如今,C主要用于需要代码优化的嵌入式/系统编程领域。您需要编写精确的代码以获得最大的数量,因为如果您开始使用该抽象,则基础内容必须非常健壮。我要说的是,您尝试解决一些开源GNU项目,例如Linux本身或需要C开发人员的项目。尝试使用这些项目,而不要在C中从头开始编写某些内容。这可能是编写代码和学习语言的更好方法。


实际上,我怀疑首先进入一个既定的项目(即使是次要的项目)是否是从头开始学习语言的好方法。你很可能会得到的方式在你的头上,也将有只是想浏览代码的额外负担,即使所有你所要做的是了解如何代码工作。操作系统内核尤其是一个非常复杂的软件。
的CVn

是的,但是我认为发问者实际上已经读过K&R书或类似的书。当我在Python频道中问我时,建议使用这种方法。C语言会有所不同吗?
Nishant

严格来说,我不知道它是否会有太大的不同,但是在C语言中,您确实需要比起诸如Python之类的高级语言更加关注细节。内存管理,仅提及件事。当您刚开始使用某种语言时,跳入一个既定的,可能很大的项目可能不是最好的方法。
的CVn

0

您将要做一些可以从命令行运行的操作。即使使用良好的 GUI框架,使用C进行GUI编程也是一个很大的难题。

对于实用的C学习经验,我通常的建议是联系列表或其他简单的数据管理应用程序。这将覆盖大多数重要的位(I / O,内存管理,文本处理等),并且您无需使用标准C库以外的任何东西即可完成此工作。C没有对图形,网络,声音或其他许多功能的内置支持1,因此,在您首次尝试C编程时,最好避免任何依赖于此类事情的东西。

C 用于通用编程;您只需要稍微降低您的期望即可(想象一下是1983年,您正坐在连接到VAX 11/750的VT52的前面,并且您的心态正确)。

请记住,C没有刀片护罩,也不会阻止您做一些愚蠢的事情。语言定义在某些地方有些松散,有些操作本身并不是违法的,但也没有很好地定义。


1-语言标准的最新版本(2011)添加了内置的线程支持


0

我推荐Euler项目。我用它来改善我的C ++,它很棒。很棒,因为每个问题都是一个小任务,可能需要不到一个小时的时间才能完成(至少是第一个问题)。

您将需要一个探查器和一本有关优化代码以提高速度的书。请务必遵守1分钟规则:您必须在1分钟内获得答案。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.