1.开发环境搭建
https://fishc.com.cn/forum.php?mod=forumdisplay&fid=329&filter=typeid&typeid=571
VIM编辑器练习:
-
h j k l 四个按键分别代表左、下、上、右,通过这4个键来移动你的光标
-
VIM编辑器模型切换
-
删除命名、撤销命令与恢复命令
撤销和恢复命令:小写的 u 表示撤销最后一次修改;而大写的 U 表示撤销对整行的修改。Ctrl + r 快捷键可以恢复撤销的内容! -
粘贴命令、替换命令、替换模式和修改命令
- 粘贴命令:使用 p 命令可以将最后一次删除的内容粘贴到光标之后。(大写的 P 则是粘贴到光标之前)
- 拷贝命令:VIM 用 y 命令实现拷贝。语法跟删除的 d 命令一样:y motion。其中的 motion 同样是用来表示操作范围的指令,即 yy 表示拷贝当前行,3yy 则表示拷贝 3 行;y$ 表示从光标所在的位置拷贝到行尾的所有字符;yG 则表示从光标所在行拷贝到文件末尾行的所有字符。拷贝完成之后同样使用 p 命令进行粘贴。
- 替换命令:r 用于替换光标所在的字符,做法是先将光标移动到需要替换的字符处,按一下 r 键,然后输入新的字符。数字 + r 可能会产生一些物理反应。先输入【数字】再输入 r,最后输入新字符,说明从当前光标的位置开始,替换【数字】个新字符。
- 修改命令:修改命令我们使用 c 键来启动,格式是:c [number] motion
-
文件信息、跳转、定位括号和缩进
- 文件信息:知道当前的文件信息,比如文件名,文件状态,文件的总行数,以及光标所在的相对位置
快捷键 ctrl + g - 跳转
在 VIM 有两种方式可以将光标跳转到指定的位置:- 行号 + G
- :行号
- 定位括号
VIM 有个按键可以帮你快速定位到另一半括号,就是 % 键。将光标移动到 (),[],{},中的任何一半括号上,按下 % 键,便可看到此时光标已经跳转到另外一半的括号上了。 - 缩进
按一下 v 进入可视模式(左下角出现 – VISUAL – 字样),然后通过 h、j、k、l 或 其他 motion 来移动你的光标,此时光标所到之处必被一道亮光所包围(表示被选中),选择好需要缩进的目标后,只需按一下 > 即可完成任务。
- 文件信息:知道当前的文件信息,比如文件名,文件状态,文件的总行数,以及光标所在的相对位置
-
搜索命令和替换命令
- 搜索命令
在搜索命令中,.、*、[、]、^、%、/、?、~ 和 $ 这 10 个字符有着特殊意义,所以在使用这些字符的时候要在前面加上一个反斜杠(\),比如你要搜索问号,则输入 /? - 替换命令
:s/old/new
,这样即可将光标所在行的第一个 old 替换为 new;你如果输入的是:s/old/new/g
,则表示将光标所在行的所有 old 替换为 new。%s/old/new/g
表示替换整个文件中每个匹配的字符串%s/old/new/gc
每次替换前咨询一下:5,13s/old/new/g
表示替换哪几行的匹配字符串
- 搜索命令
-
执行shell命令、文件另存为、合并文件和打开多个文件
- 执行shell命令:在输入冒号(:)进入命令行模式,输入感叹号(!),在其后便可以加上 shell 命令。此后 VIM 将临时跳转回 shell,并执行命令。再次按下 Enter 键回到 VIM。
- 文件另存为::w 新文件名
- 局部内容另存为
- 合并文件:输入冒号(:)进入命令行模式,然后输入 r 文件名
- 打开多个文件:VIM 使用 –o 或 –O 选项打开多个文件
- –o 表示垂直并排
- -O 表示水平并排
对于垂直并排的文件:使用 ctrl + w + 上、下方向,表示上、下切换文件;
对于水平并排的文件:使用 ctrl + w + 左、右方向,表示左、右切换文件。
退出文件的话可以使用原来的 q、q!、wq 或者 ZZ(shirt + z + z)。
只需在原来退出命令的后边加上小写 a,则表示退出动作是针对所有的(ALL):qa、qa!、wqa
2.C语言的特点
- 效率高
对于 CPU 而言,编译型语言是将源代码先通过编译器编译为 CPU 认识的机器码(可执行文件),此后 CPU 随时都可以直接执行编译后的机器码;而解释型语言则不直接编译成机器码,而是将源码转换成中间代码,然后发送给解释器,由解释器逐句翻译给 CPU 来执行
- 灵活度高
C语言不仅提供多种运算符,还提供类似于计算机底层的位操作,丰富多变的结构和数据,还可以制定一些数据类型,还拥有可以直接操作计算机硬件的能力。C语言的强大与灵活关键在于指针的掌握。 - 可移植性高
源代码在不需要做改动或者只需要稍加修改就能够在其他机器上编译后正确执行。
3.Hello World
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
4.课后作业
- CPU 唯一认识的语言是什么语言?
答:机器语言,也叫机器码,由纯数字组成(因为 CPU 只认识二进制 0 和 1) - C 语言编写的源代码转换为汇编语言的过程叫什么?
答:编译。 - 编译型语言和解释型语言的本质区别是什么?
对于 CPU 而言,编译型语言是将源代码先通过编译器编译为 CPU 认识的机器码(可执行文件),此后 CPU 随时都可以直接执行编译后的机器码;而解释型语言则不直接编译成机器码,而是将源码转换成中间代码,然后发送给解释器,由解释器逐句翻译给 CPU 来执行
- 在 Linux 系统上用 C 语言编译的可执行程序,是否能在 Windows 系统上执行?
答:不能。因为可执行文件在执行之前,操作系统要有一些准备工作,因为不同的操作系统,准备工作是不同的,所以可执行文件的格式不完全相同。比如 Windows 上大部分可执行文件为 PE 格式,而 Linux 上大部分可执行文件为 ELF 格式。格式不同导致了不同的可执行文件无法跨平台直接使用 - 解释型编程语言是如何实现跨平台的?
答:解释型编程语言为每个操作系统专门定制一个解释器作为中转,因此解释器只需提供一个统一的入口即可,如下图
- 统计当前目录及所有子目录下,C 语言源文件的代码总行数
#include <io.h> #include <direct.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 256 long total; int countLines(const char *filename); void findAllCodes(const char *path); void findALLFiles(const char *path); int countLines(const char *filename) { FILE *fp; int count = 0; int temp; if ((fp = fopen(filename, "r")) == NULL) { fprintf(stderr, "Can not open the file:%s\n", filename); return 0; } while ((temp = fgetc(fp)) != EOF) { if (temp == '\n') { count++; } } fclose(fp); return count; } void findAllCodes(const char *path) { struct _finddata_t fa; long handle; char thePath[MAX], target[MAX]; strcpy(thePath, path); if((handle = _findfirst(strcat(thePath, "/*.c"), &fa)) != -1L) { do { sprintf(target, "%s/%s", path, fa.name); total += countLines(target); }while (_findnext(handle, &fa) == 0); } _findclose(handle); } void findALLDirs(const char *path) { struct _finddata_t fa; long handle; char thePath[MAX]; strcpy(thePath, path); if((handle = _findfirst(strcat(thePath, "/*"), &fa)) == -1L) { fprintf(stderr, "The path %s is wrong!\n",path); return; } do { if (!strcmp(fa.name, ".") || !strcmp(fa.name, "..")) continue; if( fa.attrib == _A_SUBDIR) { sprintf(thePath, "%s/%s", path, fa.name); findAllCodes(thePath); findALLDirs(thePath); } }while (_findnext(handle, &fa) == 0); _findclose(handle); } int main() { char path[MAX] = "."; printf("计算中...\n"); findAllCodes(path); findALLDirs(path); printf("目前你总共写了 %ld 行代码!\n\n", total); system("pause"); return 0; }