1、书籍

只推荐目前读完后对我有帮助的书籍,微信读书都是免费可读的。

《C Primer Plus(第6版)中文版》详细讲解了C语言的基本概念和编程技巧。可作为C语言的教材,适用于需要系统学习C语言的初学者,也适用于想要巩固C语言知识或希望进一步提高编程技术的程序员。
《C陷阱与缺陷》适合有一定经验的C程序员阅读学习,即便你是C编程高手,本书也应该成为你的案头必备图书。书写于 ASCI C标准出台之前,因此有部分内容过时但译者给出提醒
《C专家编程》对C的历史、语言特性、声明、数组、指针、链接、运行时、内存以及如何进一步学习C++等问题进行了细致的讲解和深入的分析。不想学C++可跳过最后一章

2、入门视频

目前只觉得这个讲的还行,有其他不错的可推荐。

二、怎么知道自己程序是否正确?

谭浩强书籍上很多程序都有 BUG,你需要找到一个在线测试平台,这些平台有很多。其中洛谷PTA上有大部分课后习题,可以通过在该平台上提交你的代码验证正确性。我(个人因想研究算法,开发生信软件)在 Leetcode 刷算法,但是这里题目完全超过考研要求。

三、如何搭建开发环境(编译器)

(1)移动端APP:Mobile C/C++

移动端上敲代码非常麻烦,因为大多数软件都没有代码联想功能,限制很多,例如要联网或即使能本地编译但是语言支持非常有限。
Mobile C/C++安卓上可能搜不到,点击附件mobile_C++.zip可以下载,IOS应用商店上有这个应用(免费版本有广告)。这个 app 虽然界面有点丑,但是它不要求联网即可编译运行,同时支持C/C++代码补全(但是头文件引入不方便),它还支持 Python,JavaScript 等。是一款非常难得的学习软件!如果有 iPad + 键盘,那么生产力就上去。

(2)PC端:WSL1 + VS code 搭建 C/C++环境

相关概念:C 语言需要通过编译器(compiler)编译成可执行文件才能被执行。

  1. 文本编辑器:写代码的软件,例如 vim,Windows的记事本,它只是用来创建文件和输入内容,无法将 C 语言编译。
  2. 编译器:将 C 代码编译成可执行文件。常见有 GCC, LLVM和VC++。GCC和LLVM在Linux平台上比较常见,Windows默认无 C 语言编译器,因此要安装!
  3. 集成开发环境(Integrated Development Environment, IDE):简单说就是上面两个东西结合体,简化开发流程的工具。常见有 Windows 平台上 Visual Studio(对于初学者根本没必要折腾且吃内存),Clion(这玩意依然要配置编译器)

因此你想要在 PC 上写 C 代码并运行获得结果,你需要文本编辑器+编译器。不建议初学者折腾IDE,你主要是学习 C 语言而不是学习 IDE 如何使用,等之后开发项目再考虑 IDE 吧。

Windows 的 WSL 香的不行,直接使用其上的 GCC 当作 C 语言编译器。但是文本编辑器呢?

  1. 你可以使用文本编辑器编写好代码,手动在 Linux 上编译运行。例如 C 语言习题所有程序都是在 WSL1 下通过 vim + gcc 编译运行。(推荐考研党天天撸代码加强肌肉记忆
  2. VS Code 提供插件与 WSL 交互(偷懒方式:讨厌用 vim,可以用 VS Code) :::info Q:为什么建议要用这个?为何不可用 VS studio
    A:计算生物学考 Linux,生物信息学,C 语言。

  3. 就算参考书目没说考 Linux,但是今年就考了!你以后当生信研究生一定逃不了 Linux

  4. 很多生信软件都是在 Linux 上,你不得不学习!
  5. C 语言其实也可以在 Windows/Mac/Linux 上,但是基于上面两个原因在 Linux 上比较省事,而且你以后也会遇到用 conda 安装不上软件,只能从源代码编译生信软件的事(例如编译 blast。而且涉及到大数据处理的软件基本上都是 C/C++ 编写的)

总结:用最小的资源(安装 WSL)获得“最佳” Linux 体验,提前熟悉研究生所处环境,积累编程知识。 :::

VS Code(文本编辑器)+ WSL 的 GCC 编译器的安装过程,参考官方文档

个人配置:
官方文档里面给出的 C++ 配置信息只供单个文件编译运行,下面给出我自己配置,只需要按下 Ctrl + Shift + B 即可编译+运行。如果编译出错那么就会在输出框内报错,自己找 BUG 即可。 :::tips 注意如何配置 json 文件让 VS Code 知道如何进行编译才是关键,要清晰知道每个 JSON 参数的意义。本质上就等于手动在敲 gcc in.file -o out.file建议新手手敲)。也就是根据自己需要添加编译参数。详细可以了解 Variables Reference ::: |
1. 根据官方文档创建一个项目(即一个文件夹,例如此处名为 test1 ),然后在 wsl 终端输入 code . 将会启动本地Windows上的VS Code 软件。
1. 创建如右图所示的目录结构
| image.png | | —- | —- |

tasks.json 文件改写为如下:

  1. {
  2. "version": "2.0.0",
  3. "tasks": [
  4. {
  5. "type": "cppbuild",
  6. "label": "g++: gcc build and run",
  7. "command": "g++",
  8. "args": [
  9. // 如下两行是防止 gcc 编译器遇到 scanf 函数不收其返回值发出警告
  10. "-Wextra",
  11. "-Wno-unused-result",
  12. // 如下参数开启警告,编码规范
  13. "-Wall",
  14. // 如下 4 行对学习数组和指针非常有用
  15. "-fsanitize=address",
  16. "-fno-omit-frame-pointer",
  17. "-out-of-bounds",
  18. "-use-after-free",
  19. // -O2 优化
  20. "-O2",
  21. // 输入文件,即当前编译的 *.c 文件
  22. "${file}",
  23. // -o 参数后面必接上输出文件
  24. "-o",
  25. "${workspaceFolder}/bin/${fileBasenameNoExtension}",
  26. // && 是连续执行其它 Linux 命令(此处开始运行编译完毕的程序)
  27. "&&",
  28. "${workspaceFolder}/bin/${fileBasenameNoExtension}",
  29. "<", // < Linux 重定向输入符号,意思是将如下文件内的内容打印到 stdin
  30. "${workspaceFolder}/IO/input.txt",
  31. ">",
  32. "${workspaceFolder}/IO/output.txt"
  33. ],
  34. "options": {
  35. "cwd": "${workspaceFolder}"
  36. },
  37. "problemMatcher": [
  38. "$gcc"
  39. ],
  40. "group": {
  41. "kind": "build",
  42. "isDefault": true // Ctrl + Shift + B 默认操作
  43. },
  44. "detail": "compiler: g++"
  45. }
  46. ]
  47. }

参数解释:上述 task.json 所作的操作就是 编译+运行 一气呵成。

  1. 编译
    1. -Wall :开启警告,警告不表明你的程序无法运行,但是可能出现意想不到的结果(编码规范)。
    2. -Wextra -Wno-unused-result:防止 gcc 编译器遇到 scanf 函数不接受返回值发出警告。
    3. -fsanitize=address -fno-omit-frame-pointer -out-of-bounds -use-after-free:gcc 编译器内存检测工具参数(下面有案例指出)
    4. -O2:优化等级
    5. ${file} :待编译的文件 hello.c ,也就是在 VS Code 正在编辑文件,按下 Ctrl + Shift + B 就告诉 VS Code 执行 task.json 内的操作。
    6. -o ${workspaceFolder}/bin/${fileBasenameNoExtension} :gcc 编译后的可执行文件的信息。${workspaceFolder} 指当前工作文件夹 test1${fileBasenameNoExtension} 输出可执行文件的名字为 hello 。因此大意为将编译好的可执行文件放在 test1/bin/ 下且它的名字为 hello
  2. 运行 :上述编译结果若没有发生报错(或者没写死循环),则将会执行可执行文件
    1. ${workspaceFolder}/bin/${fileBasenameNoExtension} :运行放在 test1/bin/ 下且它的名字为 hello 的可执行文件
    2. < ${workspaceFolder}/IO/input.txt :将放在 test1/IO/ 下名为 input.txt 的文件内容通过重定向输入符 < 传递给 hello 可执行文件。(人话: hello 如果需要从 stdin 读取数据时,你不用手动敲(人机交互)。可以预先把你要输入信息放在 input.txt 中即可)

一个完整案例:

  1. #include <stdio.h>
  2. int main() {
  3. int n;
  4. printf("Please input your number: \n");
  5. scanf("%d", &n);
  6. printf("Hello %d :)\n", n);
  7. return 0;
  8. }

VS Code编译C文件.gif