我想学习C语言,通常当我想学习一种新语言时,我会想到一个简单/可以达到的项目目标,该目标具有一定的实际用途(使用api,自动执行任务等)。
我很难为C设计一个,主要是因为我阅读的所有内容都表明,C目前主要用于嵌入式系统和更复杂的软件项目(如操作系统)。
这是否表明我不需要学习它,或者我只需要在学习策略上更加困惑?
指实用学习资源?(教程/如何产生具有某些目的/益处的最终结果)
我想学习C语言,通常当我想学习一种新语言时,我会想到一个简单/可以达到的项目目标,该目标具有一定的实际用途(使用api,自动执行任务等)。
我很难为C设计一个,主要是因为我阅读的所有内容都表明,C目前主要用于嵌入式系统和更复杂的软件项目(如操作系统)。
这是否表明我不需要学习它,或者我只需要在学习策略上更加困惑?
指实用学习资源?(教程/如何产生具有某些目的/益处的最终结果)
Answers:
我只建议拿起Kernighan和Ritchie的The C Programming Language(第二版)的副本。在每一章的最后,您都可以进行许多练习,并对C语言进行了很好的介绍。它不会使您成为语言的精通者,但是您应该在书和练习的结尾处有足够的了解,以便找到一个用C编写的开源项目,您可以阅读该源代码并做出贡献至。
如果您想查看包含C代码的实际项目。这变得越来越困难-许多项目使用“高级”语言,但是C仍然活跃并且不断发展。如果您想学习C,请不要害怕重新发明轮子以实现学习。每天重新发明解决方案不是一个好主意,但是作为学术练习这样做是完全可以的。
您将必须真正了解内存分配。听起来您以前曾经使用过其他语言,但是这些其他语言很可能会向您隐藏内存管理的细节。在C语言中,内存管理始终是显式的。这样做有一些好处,但是这意味着您必须小心正确,否则所有地狱都会崩溃。
使用您所使用的平台可用的任何内存调试功能。对于Linux,有Electric Fence,在Mac OS X上有Guard Malloc。还有Valgrind,它支持多种操作系统。
如果无法释放应释放的内存,则会发生内存泄漏。继续这样做,将耗尽内存。即使使用后备存储(大多数人称之为虚拟内存),也可能导致系统分页过多,甚至耗尽交换空间。
如果释放已经释放的内存,则将破坏堆并崩溃,但可能不会立即崩溃。如果溢出缓冲区,也会破坏堆。内存调试工具将为所有这些提供帮助。
单元测试也有帮助。
我同意这里的大多数人的看法,即今天的语言取决于手头的任务。曾经有一段时间,您在这方面的选择有限。如今,C主要用于需要代码优化的嵌入式/系统编程领域。您需要编写精确的代码以获得最大的数量,因为如果您开始使用该抽象,则基础内容必须非常健壮。我要说的是,您尝试解决一些开源GNU项目,例如Linux本身或需要C开发人员的项目。尝试使用这些项目,而不要在C中从头开始编写某些内容。这可能是编写代码和学习语言的更好方法。
您将要做一些可以从命令行运行的操作。即使使用良好的 GUI框架,使用C进行GUI编程也是一个很大的难题。
对于实用的C学习经验,我通常的建议是联系列表或其他简单的数据管理应用程序。这将覆盖大多数重要的位(I / O,内存管理,文本处理等),并且您无需使用标准C库以外的任何东西即可完成此工作。C没有对图形,网络,声音或其他许多功能的内置支持1,因此,在您首次尝试C编程时,最好避免任何依赖于此类事情的东西。
C 可用于通用编程;您只需要稍微降低您的期望即可(想象一下是1983年,您正坐在连接到VAX 11/750的VT52的前面,并且您的心态正确)。
请记住,C没有刀片护罩,也不会阻止您做一些愚蠢的事情。语言定义在某些地方有些松散,有些操作本身并不是违法的,但也没有很好地定义。
如果您已经是一名程序员,并且只需要学习C,并且不介意学习该语言的旧版本(核心仍然几乎相同),那么Leendert Ammeraal的“ C for Programmers”将无可匹敌。。从头到尾完成它。