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)编译成可执行文件才能被执行。
- 文本编辑器:写代码的软件,例如 vim,Windows的记事本,它只是用来创建文件和输入内容,无法将 C 语言编译。
- 编译器:将 C 代码编译成可执行文件。常见有 GCC, LLVM和VC++。GCC和LLVM在Linux平台上比较常见,Windows默认无 C 语言编译器,因此要安装!
- 集成开发环境(Integrated Development Environment, IDE):简单说就是上面两个东西结合体,简化开发流程的工具。常见有 Windows 平台上 Visual Studio(对于初学者根本没必要折腾且吃内存),Clion(这玩意依然要配置编译器)
因此你想要在 PC 上写 C 代码并运行获得结果,你需要文本编辑器+编译器。不建议初学者折腾IDE,你主要是学习 C 语言而不是学习 IDE 如何使用,等之后开发项目再考虑 IDE 吧。
Windows 的 WSL 香的不行,直接使用其上的 GCC 当作 C 语言编译器。但是文本编辑器呢?
- 你可以使用文本编辑器编写好代码,手动在 Linux 上编译运行。例如 C 语言习题所有程序都是在 WSL1 下通过 vim + gcc 编译运行。(推荐考研党天天撸代码加强肌肉记忆)
VS Code 提供插件与 WSL 交互(偷懒方式:讨厌用 vim,可以用 VS Code) :::info Q:为什么建议要用这个?为何不可用
VS studio
?
A:计算生物学考 Linux,生物信息学,C 语言。就算参考书目没说考 Linux,但是今年就考了!你以后当生信研究生一定逃不了 Linux
- 很多生信软件都是在 Linux 上,你不得不学习!
- 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. 创建如右图所示的目录结构
| |
| —- | —- |
将 tasks.json
文件改写为如下:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "g++: gcc build and run",
"command": "g++",
"args": [
// 如下两行是防止 gcc 编译器遇到 scanf 函数不收其返回值发出警告
"-Wextra",
"-Wno-unused-result",
// 如下参数开启警告,编码规范
"-Wall",
// 如下 4 行对学习数组和指针非常有用
"-fsanitize=address",
"-fno-omit-frame-pointer",
"-out-of-bounds",
"-use-after-free",
// -O2 优化
"-O2",
// 输入文件,即当前编译的 *.c 文件
"${file}",
// -o 参数后面必接上输出文件
"-o",
"${workspaceFolder}/bin/${fileBasenameNoExtension}",
// && 是连续执行其它 Linux 命令(此处开始运行编译完毕的程序)
"&&",
"${workspaceFolder}/bin/${fileBasenameNoExtension}",
"<", // < 是 Linux 重定向输入符号,意思是将如下文件内的内容打印到 stdin
"${workspaceFolder}/IO/input.txt",
">",
"${workspaceFolder}/IO/output.txt"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true // Ctrl + Shift + B 默认操作
},
"detail": "compiler: g++"
}
]
}
参数解释:上述 task.json
所作的操作就是 编译+运行 一气呵成。
- 编译 :
-Wall
:开启警告,警告不表明你的程序无法运行,但是可能出现意想不到的结果(编码规范)。-Wextra -Wno-unused-result
:防止 gcc 编译器遇到scanf
函数不接受返回值发出警告。-fsanitize=address -fno-omit-frame-pointer -out-of-bounds -use-after-free
:gcc 编译器内存检测工具参数(下面有案例指出)-O2
:优化等级${file}
:待编译的文件hello.c
,也就是在 VS Code 正在编辑文件,按下Ctrl + Shift + B
就告诉 VS Code 执行task.json
内的操作。-o ${workspaceFolder}/bin/${fileBasenameNoExtension}
:gcc 编译后的可执行文件的信息。${workspaceFolder}
指当前工作文件夹test1
,${fileBasenameNoExtension}
输出可执行文件的名字为hello
。因此大意为将编译好的可执行文件放在test1/bin/
下且它的名字为hello
。
- 运行 :上述编译结果若没有发生报错(或者没写死循环),则将会执行可执行文件
${workspaceFolder}/bin/${fileBasenameNoExtension}
:运行放在test1/bin/
下且它的名字为hello
的可执行文件< ${workspaceFolder}/IO/input.txt
:将放在test1/IO/
下名为input.txt
的文件内容通过重定向输入符<
传递给hello
可执行文件。(人话:hello
如果需要从stdin
读取数据时,你不用手动敲(人机交互)。可以预先把你要输入信息放在input.txt
中即可)
一个完整案例:
#include <stdio.h>
int main() {
int n;
printf("Please input your number: \n");
scanf("%d", &n);
printf("Hello %d :)\n", n);
return 0;
}