【问题标题】:Where to start (self-)learning C, or should I learn a different language? [closed]从哪里开始(自学)C,或者我应该学习一门不同的语言? [关闭]
【发布时间】:2009-01-19 10:13:42
【问题描述】:

最近,我越来越发现,拥有广泛的编程基础知识是件好事。遗憾的是,我是(众多)自学成才的 PHP 开发人员之一,我并不后悔选择了这条路。

但是,我仍然认为我应该从零开始将我的知识扩展到一些“真正的”编程语言,并从那里积累我的知识。我无意改变我的职业道路,但我确实认为跳出网络开发的框框思考会很好。

我不喜欢上课或课程,因为我根本没有时间这样做。所以:

  • 从零级开始逐步自学 C 的最佳方法是什么?

  • 由于我的主要目标是学习更多的编程基础知识,因此 C 是否是一个不错的选择?

  • 如果不是,那会是什么语言?


到目前为止的总结:

首先,感谢所有精彩的回复。这些将非常有帮助。尽管大多数人似乎都同意从 C 开始并不是一个糟糕的选择,但我也看到有人说跳过 C 并使用 C++ 甚至 C# 可能是一个更好的主意,因为这些语言更流行。

我的个人意见仍然是从零级开始会很好,即使语言本身并没有直接有助于我做的东西。我仍然相信它会间接地让我成为一个更好的程序员。但是话又说回来,如上所述,我对这些语言的了解非常有限,所以我也很想听听您对此事的看法

【问题讨论】:

    标签: c


    【解决方案1】:

    阅读Kernighan and Ritchie“C 编程语言”。这是经典。

    这是该语言的原始创造者所写的书。它很短,可读性很好,写得很好。

    【讨论】:

    • 老实说我不会这样做。学习 K&R C 没有意义(恕我直言)。只需学习 ANSI C 并完成它。
    • 我只同意学习 ANSI C,但您可以从 K&R 较新版本中完成大部分工作。而且这本书非常基础,我仍然会推荐它
    • The C Programming Language 的第二版涵盖 ANSI C,而不是 K&R C。
    • 恕我直言,K&R 的 C 书之所以经常被提及是因为它是经典之作,而不是因为它是最好的。大多数时候,人们只是追求一本好书。
    • Aron,K&R C 的书(相对于 C 方言)不仅仅是一本经典的书,它是一本非常优秀的科技著作。阅读它不仅会教你 C 语言,还会教你一些关于它的设计者的想法,你可能也会喜欢这本书的风格和设计。
    【解决方案2】:

    我不得不不同意前面两个推荐著名的“K&R”指南的答案。我完全无法从那本书中学到任何东西。我在读了这本书的前三分之一大约三遍后就放弃了。也许我只是个笨蛋。

    我建议,相反,这本精彩的书:C Programming: A Modern Approach(免责声明:亚马逊链接)

    我从那本书中学到了关于 C 的所有知识,它涵盖了所有需要完成的历史,同时仍然保持“现代”观点。

    警告:我不是“为 C”来 C 的,我是在通往最终目标的过程中通过它,在 Apple 的 Mac OS X 上为桌面应用程序编写 Objective-C 和 Cocoa 编程。如果你真的想要一个非常对C有深入了解,上述两本书都入手了,读完Modern C再读K&R指南,应该不会有什么坏处吧

    【讨论】:

    • +1:CPMA 是一本很棒的书,我绝对会向那些不喜欢 K&R 简洁风格的人推荐它。它还涵盖了整个语言,包含许多有用的问答并涵盖了 C99,所有这些都是对 K&R 的重大改进。
    • 多年后回到这个答案,我应该指出:我的最后一段是正确的。我现在几乎只开发 ISO C '99,而 K&R 显然是首选。不过,我永远不会建议从它开始; CPMA 和 K&R 似乎是 The Way to Go™。希望这对未来的读者有所帮助。 (-:
    【解决方案3】:

    我学习 C 的第一步是一本《The C Programming Language》——这是一本简单的书,但语言本身非常简单。

    【讨论】:

    • 感谢您的回答,我会调查的;能否请您也链接到这本书/作者?
    • 说真的,你不能在亚马逊上搜索??
    • 我当然可以,但是作为答案的作者也可以这样做,并且本网站的主要目标是提供可能的最佳答案,我不认为这是一个奇怪的要求。
    • 这本书和尼克的回答是同一本书吗?
    • 是的,我们只是同时回答了
    【解决方案4】:

    好吧,如果您想“从零级开始”,我建议您学习汇编。是的组装。我学了6502,喜欢的可以学x86或者arm或者mips。找一个模拟器或中断器并阅读一些教程。您将准确了解 CPU 的工作原理,并且代码会更有意义(例如为什么 getkeys 在您执行 pollkeys 等操作之前不会更新)。

    在那之后我推荐 C#,因为它不像 c/c++ 那样讨厌(我主要使用 c++)。您将了解如何在汇编中表示 C# 行。与 c 和 c++ 不同,C# 允许您做更多您想做的事情(这里列出了我们可以在 c++ 中做的事情,我们将在下一个标准http://en.wikipedia.org/wiki/C%2B%2B0x 中做这些事情,C# 有其中的一些)。

    如果你想学到很多东西,你可以尝试学习我在这里推荐的语言https://stackoverflow.com/questions/498964/the-difficulty-in-learning-new-languages-by-yourself/578618#578618,我认为这是一个组装后的好主意。

    【讨论】:

    • 感谢您的回答,以及对问题的不同见解,我很感激!
    【解决方案5】:

    如果您会说德语,我建议您使用open book from Galileo Computing

    【讨论】:

      【解决方案6】:

      如果您想学习编程基础知识,另一个选择是阅读 Knuth 的 The Art of Computer Programming。这将从一开始就向您介绍基础知识。为了进一步理解,请自己在 C 中实现算法。

      【讨论】:

        【解决方案7】:

        印第安纳大学和普渡大学开设了一门关于 C 编程的大学课程。该课程有视频讲座,您可以在here找到。

        如果你也对 C++ 感兴趣,Web Lecture Archive Project 有很多讲座,名为“C++ for Particle Physicists”。你会发现那些讲座here。讲座由斯坦福大学的 Paul Kunz 主持。

        如需更多 C++ 讲座,您还可以查看 Reconnect Networks 的 these lectures

        【讨论】:

          【解决方案8】:

          C 是主流教育的不错选择。但是,在阅读书籍之前,我会先学习一些 IDE 教程,这样你才能掌握构建项目和 makefile 的窍门,这两个将是你最初将面临的最大挑战,而且很少会在任何书籍中涉及它们。

          【讨论】:

          • 感谢这里的实用提示,我会记住的。
          【解决方案9】:

          阅读“C 编程语言”。写一些简短的练习(有些在书中)。使用编译器,例如gcc

          【讨论】:

            【解决方案10】:

            C 编程语言是一个很好的起点。

            此外,C 本身是学习编程基础的良好起点:您几乎可以在任何地方找到 C 软件和 C 开发人员,并且许多其他语言都植根于 C,例如 C++、C#、Objective-C...

            【讨论】:

              【解决方案11】:

              在阅读了许多人建议的“C 编程语言”之后,我将开始研究开源项目并从实际示例中学习。有很多,要找到合适的并不容易,但是从阅读好的代码中学习是向好的编码员学习的最佳选择:)
              如果你身边有一个:结对编程或只是相互代码审查是最好的学习方式。

              【讨论】:

                【解决方案12】:

                1) C 编程语言 K&R 2)阅读大量C源代码。 Google code search

                就是这样。

                【讨论】:

                  【解决方案13】:

                  如果您想阅读一些好的源代码,我可以衷心推荐 Simon Tatham 的 Puzzle Collection(http://www.chiark.greenend.org.uk/~sgtatham/puzzles/,向下滚动到底部以获取开发人员文档)。从中,你可以了解到:

                  • 如何在 C 中进行类似面向对象的编程(从某种意义上说,每个游戏都是一个实现“游戏”接口的类)。
                  • 如何编写可移植的 C(将所有不可移植的东西隐藏在您自己的界面后面)。
                  • 如何评论和记录您的代码。
                  • 如何在 C 中进行 GUI 编程。
                  • 如何在 C 中实现数据结构(我记得联合查找和 2-4 棵树正在完成)。

                  【讨论】:

                  • 请添加指向您正在讨论的资源的链接。
                  【解决方案14】:

                  我认为您当前的方法是不正确的。 C 目前是 C++ 的一个子集,没有现代 OO 语言的许多概念。在大多数情况下,它被归入遗留系统,大多数与遗留代码无关的新开发不是用 C 编写的。就我个人而言,我从 C++(自学)开始,然后转向 C#。从 C++ 开始为您提供了了解面向对象以及在低级别发生的事情所需的所有基础知识。但是,对于刚入门的人,我现在推荐 C#,原因很简单,即它更容易起步并开始运行。此外,c# 中的一些概念在 C 世界中几乎没有类似物,并且使编程更加直观(LINQ、lambdas 等)。虽然内存管理很重要(偶尔会出现在 C# 中),但管理起来很痛苦,而且在启动时更容易不用担心。您越早开始一个有趣的项目,您放弃的可能性就越小。

                  【讨论】:

                  • 感谢您的回答。很高兴看到对此事的另一种看法。我不打算在生产环境中使用 C,但仍然相信拥有这种语言的经验和理解是非常有用的。其他人对此有何看法?
                  • C 仍然广泛用于系统编程、嵌入式设备等领域——绝对与遗留代码相去甚远。 C++ 要复杂得多,它为您提供了更多的方法来射击自己的脚,并且在这样做时会受到更多伤害。只有当你对 C 有很好的掌握时才转向 C++,它会简化过渡。不幸的是,我对 C# 没有确切的看法。
                  【解决方案15】:
                  【解决方案16】:

                  关于学习 C

                  如果你真的想学习 C,[Kernighan 和 Ritchie “The C Programming Language”一书](http://en.wikipedia.org/wiki/The_C_Programming_Language_(book)) 是一个好的开始。

                  然而现在,在我看来,学习 C 只是一种思维练习——你可以学习很多重要的细节,例如:

                  1. 等号运算符 (==) 和赋值指令 (=) 之间的区别,
                  2. 表达式可以有值(即a = 1有值1),
                  3. 指针算术,
                  4. 直接内存操作(即memset()memcpy())。

                  这些东西对开发者来说很有趣,但它们中的大多数在当今的主流应用程序开发中都没有使用(除了上面的第一点)。

                  但是,如果您尝试参加一些计算机竞赛,C 语言可能会很有用。

                  我的建议

                  我会学习 C#,因为它是现代的、设计良好的(在我看来)面向对象的编程语言,具有良好的免费 IDE --Visual Studio Express Edition,良好的支持(广泛的社区,大量源代码要研究,一个很多教程和例子)。使用 C#,您可以编写控制台应用程序、桌面应用程序或 Web 应用程序,通过解决广泛的实际问题来轻松学习。

                  此外,在 .NET 平台上还有一些其他有趣的选择——IronPyton 或功能性F#

                  【讨论】:

                    【解决方案17】:

                    让我们 C by Yeshvant P Kanitkar

                    【讨论】:

                    • -1:Kanetkar 的书真的很糟糕,更不用说严重过时了。
                    猜你喜欢
                    • 2018-12-20
                    • 2023-03-24
                    • 2011-03-23
                    • 1970-01-01
                    • 2010-09-10
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-11-03
                    相关资源
                    最近更新 更多