42

我有一些 C 的基本知识(以及更多的 C++)。我得到了一份 K&R,我想用它来帮助我更深入地研究这门语言。什么是涉及使用 C 的大部分功能和标准库的好主意?另外,我应该注意 C89 和 C99 之间的哪些重要区别?

编辑:忘了提,这对初学者来说应该是可行的。我不是要编程教程。相反,中等规模的东西。我知道操作系统的东西是 C 的主要目的之一,但这不会太复杂吗?

此外,阅读和回答问题总是一个好主意,但我想进行一些实际练习,制作一个可以做事的程序。

4

15 回答 15

67

实现一种编程语言。这不必非常难——我做了一种不能被命名的语言——但它会迫使你学习 C 的很多重要部分。如果你不想编写词法分析器和/或解析器您自己可以使用 lex/flex 和 yacc/bison,但如果您计划这样做,您可能希望从一个较小的项目开始。

拿一些你用高级语言编写的程序并重写它。如果您有一个经常使用的 Perl/Python/Ruby/Bash 脚本,并且您注意到它在运行时存在延迟,请用 C 重写它,重点关注性能。

然而,我的观点是,如果你正在编写一个学习 C 的程序,最好重新发明轮子。用 C 编程就是制造和调整轮子,如果你只是通过使用为你抽象出轮子的库来学习 C,那么你真的没有在学习 C。它可能会更快——而且当你工作的时候在 C 的实际项目中,无论如何,不​​要重新发明轮子——但如果你这样做是为了学习,那么一定要学习轮子是如何工作的。

于 2009-08-10T22:25:09.287 回答
30

在 StackOverflow 上阅读和回答 C 问题是了解语言细节的好方法。

于 2009-08-10T21:52:27.060 回答
16

我建议通过这些工作:http ://projecteuler.net/ 。当然,有时它有助于在 C 中低效地执行其中一些操作,以了解蛮力需要多长时间。然后尝试想出一个更聪明的方法,真正看到C的美妙之处!

于 2009-08-10T22:24:51.847 回答
7

简单语法语言的解释器。当然,不应该使用词法分析器/解析器生成器来让它变得有趣。

于 2009-08-10T22:20:53.460 回答
6

建立一个国际象棋游戏。这可能非常简单,因为您甚至可以使用普通控制台来完成。它可以让您实现一些逻辑、使用数据结构、使用指针等。存储分数以便您开始使用持久性。

于 2009-08-11T18:32:51.217 回答
4

取决于你想去多深,也许Doom

于 2009-08-10T21:50:10.247 回答
4

硬件(嵌入式微处理器系统)和操作系统内核代码?

于 2009-08-10T21:52:17.760 回答
4

当我想学习一门新语言时,我总是想出一些我觉得有用的实用程序并写下来。我发现编写一个将要使用的实际程序教给我的不仅仅是概念证明。

例如,您可能会编写一个程序,从指定的目录开始,它将横向向下构建所有文件的列表并对其进行处理。就像给你一个简单的列表,列出所有大于指定大小的文件。然后弄清楚如何添加过滤器,以便完成后您可以使用它来清理目录。它可能会查找“备份”一词或包含 tmp 的文件。不要忘记至少有一个函数可以将指针传递给指针以获得良好的感觉。

是的,我知道您可以将其作为脚本执行,但您也可以自定义特定于您的内容。

于 2009-08-10T22:35:09.267 回答
2

在这种情况下,我最喜欢实现的程序是正则表达式匹配程序,它使用非常基本的语法,但使用了语言的许多低级特性(鉴于 C 是相当低级的语言,这是其中的大部分) .

于 2009-08-11T00:05:08.290 回答
2

用 c 完成http://projecteuler.net/怎么样?那应该会触发一些脑细胞:)

于 2009-08-12T07:54:59.970 回答
1

做一些内核黑客

sudo apt-get install git-core
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6

我用ubuntu,所以我做了一个apt-get,我也用gentoo,那里的命令是# emerge dev-util/git

于 2009-08-10T22:49:46.803 回答
1

一个简单的数据库应用程序(联系人列表、电影、专辑等)也可能是一个不错的项目;它将涉及文件 I/O、交互式 I/O、内存管理、相当丰富的数据结构等。

于 2009-08-11T18:19:09.123 回答
0

因为语言的差异不要太担心。它们的数量不多,但仍然如此。(我写了 2 年的 c 但仍然不知道那里有什么标准,如果我得到不受支持的编译器,则需要几分钟来修复代码)

可能发生的最令人沮丧的事情之一是通常在代码中间定义值,例如 for(int i;i<2;i++); 循环,它被认为是唯一的 c++ 规范。这就是我所面对的。在交叉编译中,您会发现其他更令人沮丧的标准差异。

对于从 c 开始,我建议学习算法和操作系统或嵌入式系统(到目前为止,c 仍然是低/中端嵌入式系统上最常用的语言)

例如从 microchip、atmel 或 freescale 获得一些硬件,并检查他们的嵌入式 RTOS 支持。

于 2009-08-10T22:38:41.660 回答
0

2006年 ICFP 竞赛问题非常有趣。第一部分,实现虚拟机,是一个小问题,只是 C 仍然适用的那种事情。但是,它不会教你很多标准库。

于 2009-08-10T23:19:43.747 回答
0

也许会看到(并改进)bigfiles.c 和 man 3 fts 的使用(遍历文件层次结构):

http://codesnippets.joyent.com/posts/show/1888

于 2009-08-12T07:27:37.843 回答