V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nnnToTnnn
V2EX  ›  程序员

[求助]最近在想学 C 语言,大家有没有好的意见,或者学习资料之类的?

  •  
  •   nnnToTnnn ·
    jhoneybee · 2019-11-21 11:45:19 +08:00 · 4395 次点击
    这是一个创建于 1837 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位 V 友,是这样的,因为 C 语言编译后部署后字节很小,并且对 Linux 或者 Window,android 等等系统十分和善,所以我想系统的学习一下 C 语言。但是似乎找不到一些很好的学习资料。在此问问大家有好的学习资料吗?

    想学一些比较底层的,例如 lwip 或者 tun/tap。还有网络协议

    28 条回复    2019-11-22 12:11:50 +08:00
    capping
        1
    capping  
       2019-11-21 12:42:11 +08:00 via iPhone   ❤️ 2
    先看《 c 程序设计语言》,然后再看《数据结构与算法分析-c 语言描述》,再然后看《 Redis 设计与实现》,然后的然后...
    cigarzh
        2
    cigarzh  
       2019-11-21 13:50:29 +08:00
    难道不是先学语法吗…
    dreamerlv3ex
        3
    dreamerlv3ex  
       2019-11-21 13:53:48 +08:00
    网络看看 nginx redis
    TabGre
        4
    TabGre  
       2019-11-21 14:06:46 +08:00
    也想巩固一下,看的书籍是 C Primer Plus
    taogen
        5
    taogen  
       2019-11-21 14:29:57 +08:00
    1. The C Programming Language (2nd, 1988) by Brian W. Kernighan, Denis M. Ritchie
    2. Pointers on C (1997) by Kenneth A·Reek
    3. Expert C Programming: Deep C Secrets (1994) by Peter van der Linden
    4. C Traps and Pitfalls (1989) by Andrew Koenig
    Hanggi
        6
    Hanggi  
       2019-11-21 14:38:20 +08:00
    感觉你这么想是不对的。

    首先你这么问了,就说明你对操作系统了解还不是很深。不是说你会了 C 语言就能做什么,而是你要了解 C 语言在操作系统中怎么运用的。如果真的感兴趣,先去看操作系统相关的书。语言只是工具。

    如果只是想做个应用程序,Go 语言、Java 什么的都都有很多不错的工具。
    Hanggi
        7
    Hanggi  
       2019-11-21 14:41:12 +08:00
    换一种说法就是,
    如果把 C 语言作为应用程序开发工具,它通常不是最好的选择。
    但是如果系统学习 Linux 操作系统,自然就会对 C 语言有更深的理解。
    nnnToTnnn
        8
    nnnToTnnn  
    OP
       2019-11-21 14:53:18 +08:00
    @Hanggi 是这样的在 linux 或 window 等其他平台中对于系统 lib 库的调用非常友好,但是 Java 来说大量依赖三库进行包装,特别是 Java,例如在 Java 中调用 Window API 需要采用 JNI 或者三分产品进行封装 Window API 提供 Java 接口。

    但是相对于 C 而言就简单很多。

    Go 虽然达到了 C 的效果,并且支持交叉编译,非常友好。所以我一直在 C 和 Go 中犹豫,但是 Go 似乎没有比较友好的集成开发环境。而且体积想对于 C 而言稍微大一点。


    当然应用程序 Java Go 都可以做,甚至 html 也可以做 UI,但是无论哪种打包的体积都很大,就算压缩了大小都超过了 30mb 了,其实我只是想用 C 做一些小工具。并且熟悉一下 C 语言。
    cmdOptionKana
        9
    cmdOptionKana  
       2019-11-21 15:03:57 +08:00 via iPhone
    不太理解,为什么要那么介意体积?

    体积小点,好处并不大啊
    nnnToTnnn
        10
    nnnToTnnn  
    OP
       2019-11-21 15:08:29 +08:00
    @cmdOptionKana e....mmm 如果一个程序,能做到比之前更小,运行效果更好,这何尝不是一件好事情。最求最佳,我是这么理想的 =。=
    cmdOptionKana
        11
    cmdOptionKana  
       2019-11-21 15:09:28 +08:00 via iPhone
    不过如果对编辑本身有着不折不挠的兴趣,从 C 入门是个非常好的选择。
    liang96
        12
    liang96  
       2019-11-21 15:10:41 +08:00 via Android
    @nnnToTnnn 打算重新开发什么软件呢?
    dosmlp
        13
    dosmlp  
       2019-11-21 15:12:38 +08:00
    C 语言不是很简单么
    nnnToTnnn
        14
    nnnToTnnn  
    OP
       2019-11-21 15:13:54 +08:00
    @liang96 没有打算重新开发软件,而是想学习,如果是想开发软件的话,估计仅仅只是想开发一个可以审计流量的 vpn =。= 当然技术有限,还在学习 lwip 中
    cmdOptionKana
        15
    cmdOptionKana  
       2019-11-21 15:18:28 +08:00
    @nnnToTnnn 语言的 “好” 有很多维度,“占用内存小、运行效率高”是一种,但是相对来说,“代码量少、不容易出错、容易维护”是被更广泛认同的更好的优点。

    一般来说,C 语言比较适合用来学习,但当你真的想做个有实用性、后续容易维护、健壮的程序,会发现 C 语言用起来太累了。
    xsen
        16
    xsen  
       2019-11-21 15:21:09 +08:00
    若是对 IoT 类感兴趣,可以直接基于 freertos,研读其源码与进行测试。因为如上所说对 lwip 感兴趣,那么就非常适合,freertos 网络部分就是集成了 lwip。进一步,还可以对 ble、wifi、lora 这些做进一步深入,包括协议类如 mqtt 这些

    若是要考虑跨平台+网络类应用,go 是最理想的选择。开发效率高,易学,是非常理想的跨平台开发方案。利用 golang 的 qt binding 也可以做 UI
    nnnToTnnn
        17
    nnnToTnnn  
    OP
       2019-11-21 15:26:15 +08:00
    @xsen 跨平台的开发方案,我这边对 javafx 和 java 比较熟悉,主要是对 IoT 比较有兴趣。其实主要还是对 lwip 比较感兴趣。谢谢啦,我去研究下 freertos
    ahojcn
        18
    ahojcn  
       2019-11-21 16:44:46 +08:00
    b 站搜 翁恺 老师的 C/C++ 课程看看。
    sosilver
        19
    sosilver  
       2019-11-21 17:09:13 +08:00 via Android
    Modern C,今年出版的,对标 C17
    beyondex
        20
    beyondex  
       2019-11-21 17:10:31 +08:00 via Android
    目前用的什么语言?如果是 Java 你就搜 Java 和 c 的差别,然后你理解差异的部分就可以了,这是最快的。
    qakito
        21
    qakito  
       2019-11-21 17:25:53 +08:00
    TCP/IP 详解 + unix 网络编程
    bwangel
        22
    bwangel  
       2019-11-21 18:01:16 +08:00
    C 语言体积小有时候是因为动态加载库吧?

    我觉得动态加载是 C 语言中的一个大坑,尤其在 Linux 上安装软件的时候,某个软件依赖了一个动态库,还需装个包来安装这个库,然后装完了发下版本不同,还得要找旧版本。。。这个真是非常痛苦的过程

    我觉得 Go 做的就很好,把所有文件都打包到一起,不整什么动态加载,部署运行直接扔一个二进制文件就完事。
    bwangel
        23
    bwangel  
       2019-11-21 18:16:31 +08:00   ❤️ 3
    https://github.com/rswier/c4 用 C 实现的一个简单编译器
    https://github.com/hx1997/SimpleHttpServer.git 用 C 实现的一个简单 HTTP 服务器。
    https://github.com/udp/json-parser 用 C 实现的一个 json 解析器。

    别听楼上那些人瞎扯淡,上来就看什么 Redis,Nginx,哪些玩意的代码几万行,十几万行,没个几年的功夫啃不下来。可以先看一些小项目,代码行数在两千行以内的,先熟悉用 C 怎么写一个项目。

    看这些小项目的时候,可以在手边放几本书《 C Primer Plus 》,《 Linux/Unix 系统编程手册》,遇到不懂的,就去找对应的章节看一遍。

    看完这些,依然感兴趣的话,可以再来挑一个大项目来看。看大项目之前,一定要先用熟悉(例如 Nginx 要会配置,Redis 提供的数据结构基本都用过一遍),然后再挑一个大项目的一个模块来看。
    edimetia3d
        24
    edimetia3d  
       2019-11-21 19:58:02 +08:00   ❤️ 1
    今年抽空把 <C 语言程序设计:现代方法(第 2 版)> 看了. 确实是本好书, 只有二三处瑕疵吧, 比如某些实践中不应该用的 featrue 也详细的介绍了一下. 语言层面非常推荐看这本书.

    至于其他所谓的底层编程, 和 C 的关系并不是很大, 这些问题一般都和硬件及 OS 有紧密的关系, CSAPP 这样的书可以作为入门. 其他的则可以进一步按需求补充
    tomychen
        25
    tomychen  
       2019-11-21 20:02:17 +08:00
    K&R
    crclz
        26
    crclz  
       2019-11-22 00:07:04 +08:00
    还有部署洁癖呢?还有部署洁癖呢?还有部署洁癖呢?还有部署洁癖呢?
    wind315
        27
    wind315  
       2019-11-22 11:35:29 +08:00 via iPhone
    赞同楼主的观点,确实 c 出来的东西很小很快,不过对要求比较高,很多程序员无法达到,所以就出现了现在这种不太重视运行效率而变为追求开发速度的状态。大家如果觉得不用太追求体积效率的话,可以搜索一个行业软件 sawstudio,这个软件的作者秉承了一直用汇编写代码,再动不动就上 g 的时代,大家对 10 多 m 的软件能如 ps 一样优秀怎么看?
    Twain
        28
    Twain  
       2019-11-22 12:11:50 +08:00
    ffmpeg nginx 用 c 写的 学好它们就行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1231 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:00 · PVG 02:00 · LAX 10:00 · JFK 13:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.