2019 木犀星计划 C 语言学习
C 语言简介
C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的。
C 语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐,成为最近 25 年使用最为广泛的编程语言。当前,C 语言编译器普遍存在于各种不同的操作系统中,例如 Microsoft Windows、macOS、Linux、Unix 等。C 语言的设计影响了众多后来的编程语言,例如 C++、Objective-C、Java、C#等。
C 语言的特点
- 易于学习。
- 结构化语言。
- 它产生高效率的程序。
- 它可以处理底层的活动。
- 它可以在多种计算机平台上编译。
C 语言发展历程
K&R C -> C89 -> C99 -> C11
C 语言最初由 Dennis Ritchie 于 1969 年到 1973 年在 AT&T 贝尔实验室里开发出来,主要用于重新实现 Unix 操作系统。此时,C 语言又被称为 K&R C。其中,K 表示 Kernighan 的首字母,而 R 则是 Ritchie 的首字母。他们写过 C 语言领域最经典书籍《C 程序设计语言》。现在 K&R 标准已经被淘汰。
由于 C 语言被各大公司所使用(包括当时处于鼎盛时期的 IBM PC),因此到了 1989 年,C 语言由美国国家标准协会(ANSI)进行了标准化,此时 C 语言又被称为 ANSI C。中国学校 C 语言教材大部分是基于 C89 标准的。
在随后的几年里,C 语言的标准化委员会又不断地对 C 语言进行改进,到了 1999 年,正式发布了 ISO/IEC 9899: 1999,简称为 C99 标准。C99 标准引入了许多特性,包括内联函数(inline functions)、可变长度的数组、灵活的数组成员(用于结构体)、复合字面量、指定成员的初始化器、对 IEEE754 浮点数的改进、支持不定参数个数的宏定义,在数据类型上还增加了 long long int 以及复数类型。目前这个标准的应用相当广泛。
Linux 下的 C 语言开发
在很多人的眼里,C 语言和 linux 常常是分不开的。这其中的原因很多,其中最重要的一部分我认为是 linux 本身就是 C 语言的杰出作品。当然,linux 操作系统本身对 C 语言的支持也是相当到位的。作为一个真正的程序员来说,如果没有在 linux 下面用 C 语言编写过完整的程序,那么只能说他对 C 语言本身的理解还相关肤浅,对系统本身的认识也不够到位。作为程序员来说,linux 系统为我们提供了很多理想的环境,这其中包括了下面几个方面:
- 完善的编译环境,包括 gcc、as、ld 等编译、链接工具
- 强大的调试环境,主要是 gdb 工具
- 丰富的自动编译工具,主要是 make 工具
- 多样化的 os 选择,ubuntu、redflag 等等
- 浩瀚的开源代码库
当然,不管我怎么说,最终朋友们还是应该自己勇敢地跨出前进的第一步。如果还没有过 Linux 编程经验的朋友可以首先在自己的 pc 上面安装一个虚拟机,然后就可以在 shell 下面编写自己的 C 语言代码了。
如果您想要设置 C 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器 和 C 编译器。
文本编辑器
文本编辑器将用于输入您的程序。常用的文本编辑器包括 Windows Notepad 和 vim/vi。
文本编辑器的名称和版本在不同的操作系统上可能会有所不同。例如,Notepad 通常用于 Windows 操作系统上,vim/vi 可用于 Windows 和 Linux/UNIX 操作系统上。
通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。C 程序的源文件通常使用扩展名 ".c"。
在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。
设置默认编辑器为 vimsudo update-alternatives --config editor
选择vim.basic
编译器
写在源文件中的源代码是人类可读的源。它需要"编译",转为机器语言,这样 CPU 可以按给定指令执行程序。C 语言编译器用于把源代码编译成最终的可执行程序。
Linux 下最常用的 C 语言编译器是 gcc,一般系统是自带的。终端输入 gcc --version
查看 gcc 的版本
gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2
3
4
这里再推荐安装一些工具sudo apt install build-essential manpages manpages-dev
build-essential 里面包含了很多开发必要的软件包,很全很方便。
manpages 是 Linux 下的手册,可以随时查阅资料。比如你忘记了 pow 函数的用法,只需要man pow
就会出现详细的信息供你参考。
编写简单的 C 语言程序
打开终端,输入vi test.c
,进入编辑模式输入
#include <stdio.h>
int main()
{
printf("hello!\n");
return 1;
}
2
3
4
5
6
保存退出后,你会看到当前目录多出了一个 test.c 文件,文件里保存的是你输入的源代码。
终端输入ls -l && cat test.c
看看效果。( ls 命令列出文件,cat 命令输出文件内容 )
终端输入 gcc test.c
,回车,编译代码。如果代码中没有错误,命令提示符会跳到下一行,并生成 a.out 可执行文件。
终端输入./a.out
来执行程序。你可以看到屏幕上显示 "Hello World"
如果想指定编译后输出的文件名,可以使用 gcc test.c -o test
。其中 test 为可执行文件(Linux 识别文件不需要后缀名,但为了方便还是会用)
我们知道计算机中所有的文件都是以二进制的方式储存的,现在来看看我们写的程序是如何用二进制表示的。
源代码部分:终端输入 od -Ad -tcd1 -w1 test.c
回车
0000000 #
35
0000001 i
105
0000002 n
110
0000003 c
99
0000004 l
108
0000005 u
117
0000006 d
100
0000007 e
101
...............
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
左边第一列是地址(10 进制),地址从 0 开始不断往后延伸,表示数据存放的位置,每个地址可以存放 1 个字节的数据。右边一列上面是你输入的字符,下面是字符对应的数字(十进制)。
可执行文件部分:终端输入od -Ad -tx a.out
,文件内容是用 16 进制表示的。
0000000 464c457f 00010102 00000000 00000000
0000016 003e0003 00000001 00000580 00000000
0000032 00000040 00000000 00001a00 00000000
0000048 00000000 00380040 00400009 001e001f
0000064 00000006 00000005 00000040 00000000
0000080 00000040 00000000 00000040 00000000
...............
2
3
4
5
6
7
上面我们学习了手动编辑源代码和编译、执行文件。这种编程方式比较原始,效率也很低,实际开发我们会使用 IDE。集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。如微软的 Visual Studio 系列,Borland 的 C++ Builder、Delphi 系列等。该程序可以独立运行,也可以和其它程序并用。
后续学习
这篇文章简单的介绍了 C 语言和 Linux 环境下 C 语言开发方式,包括编辑、编译、执行文件等等。后面还要进一步学习 C 语言,我给大家推荐一些教材:
练习题: PAT (Basic Level) Practice (中文)
https://pintia.cn/problem-sets/994805260223102976/problems/type/7
入门书籍:
《明解 C 语言》(指针部分写的很差,其他的还不错)
《C 语言程序设计现代方法》 豆瓣评分 9.4 我没看过,不做评价
《C 程序设计语言》 K&R (经典中的经典,有点难,入门不适合用这本书)
进阶:
做一些小项目之后可以看 《C 专家编程》 《Linux C 编程一站式学习》 《C 陷阱与缺陷》