我对学习C感兴趣。我读过K&R、 我甚至用R和Python做了一些简单的C扩展工作。对于用C做一些更实质性的事情,什么是有价值的项目想法?有什么好的在线资源,类似于Dive Into Python吗?特别是,资源集中在那些已经了解新语言并试图学习C语言的程序员身上(其中提到"在C语言中询问数组的长度是无稽之谈,你这个懒惰的Python主义者")。
我的背景:
数学/统计,Python、R的日常编程,主要围绕自然语言处理、算法等。
几年前,我的一个朋友问我同样的问题:"我如何学习C?"我告诉他写一个设备驱动程序。
想象一下,当他真的这么做的时候,我会感到惊讶。
看看在K&R用哪本书来学习纯C语言的编程?
有些离题,但既然你提到你的背景是数学和统计,你应该试试Project Euler。有200多个与数学/统计相关的问题可供解决。此外,一旦你找到了解决方案,你就可以查看问题论坛,看看其他人是如何解决同一解决方案的。非常方便查看他人如何解决问题。。。踢起来很有趣!
www.projecteuler.net
我和你有相似的背景。我使用Python为我的博士研究和网络编程做了很多数学和数据分析。不同的是,早在90年代,我就先学会了C。
如果你能为Python编写C扩展,那么我认为你已经很好地掌握了C的优点。在我看来,今天的C最适合做两件事:
- 编写与硬件交互的低级软件
- 编写重复、乏味、占用CPU的代码(数学、XML解析等)……也许是对高级语言的扩展
当然,许多高级应用程序也是用C编写的,尤其是在我发现的Linux下,但在很大程度上,这些应用程序并不是用K&R或标准库。相反,他们使用Glib、wxWindows、Apache Portable Runtime等框架,这些框架都使用了某种面向对象的结构或约定,并且经常抽象掉C.的一些基本内存管理细节
因此,我认为在当今的编程语言环境中,让你的C技能变得有用主要是做低级工作,或者熟悉其中一个高级框架。我个人非常喜欢Glib和GTK库,因为它们使用了非常动态面向对象的模型(非常像Python),而不会阻止您使用C.的低级功能
您可以为一种简单的语言编写一个解释器。使用flex/bison。让它成为多线程的等等。这很有趣,而且经常锻炼指针。我为一个学校项目写了这样的东西:一种简单的基于堆栈的语言,有两个不同的垃圾收集器,TwoSpace和一个并发版本。那很有趣。作为有史以来第一个比"你好,世界"更大的c程序,它是可行的!
看看如何艰难地学习C,这是一本免费的电子书,它会带你学习许多C代码和练习的例子。
http://c.learncodethehardway.org/
在日常工作中发现或定义一个问题,并强迫自己使用C而不是Python来解决它。这将迫使你学习语言,同时让问题与你通常做的事情相关。
实现一个虚拟机(例如JVM)。