第一个程序

基本概念

编程语言(Programming Language)分为:

  • 低级语言(Low-level Language):机器语言(Machine Language)和汇编语言(Assembly Language)属于低级语言,直接用计算机指令编写程序。
  • 高级语言(High-level Language):C、C++、Java、Python等属于高级语言,用语句(Statement)编写程序,语句是计算机指令的抽象表示。

C语言的语句和低级语言的指令之间不是简单的一一对应关系,需要由编译器(Compiler)来编译(Compile)才能翻译成机器指令。

C语言是可移植的(Portable)或者称为平台无关的(Platform Independent)。不同的计算机体系结构有不同的指令集(Instruction Set),可以识别的机器指令格式是不同的,直接用某种体系结构的汇编或机器指令写出来的程序只能在这种体系结构的计算机上运行,然而各种体系结构的计算机都有各自的C编译器,可以把C程序编译成各种不同体系结构的机器指令,这意味着用C语言写的程序只需稍加修改甚至不用修改就可以在各种不同的计算机上编译运行。

这里就不得不提一下库。库可以看作是操作系统与程序的一个桥梁,通过库函数可以实现一些常用功能。为了规范,ISO C 和 POSIX 定义了库的标准格式,只要遵守这俩标准,写代码时就能在不同结构的计算机上使用同样的库函数。

总结一下编译执行的过程,首先你用文本编辑器写一个C程序,然后保存成一个文件,例如program.c(通常C程序的文件名后缀是.c),这称为源代码(Source Code)或源文件,然后运行编译器对它进行编译,编译的过程并不执行程序,而是把源代码全部翻译成机器指令,再加上一些描述信息,生成一个新的文件,例如a.out,这称为可执行文件,可执行文件可以被操作系统加载运行,计算机执行该文件中由编译器生成的指令。

第一个程序

按照惯例,第一个程序必然是“Hello,world!”。我们新建一个 hello.c 文件,输入:

#include <stdio.h>
/* This is a comment */

int main(void)
{
    printf("Hello, world!\n");
    return 0;
}

稍微分析一下这个程序:

  • #include <stdio.h> 引入了 stdio.h 头文件,里面定义了 printf 函数。
  • 注释用 /**/ 包围
  • int main(void) 是所有 c 的程序入口。
  • printf() 用于打印 “Hello,world!”。
  • return 0 用于告诉编译器一切正常。

保存后,编译执行:

$ gcc hello.c -o hello 
$ ./hello
Hello, world!

这里我们用 -o (output)参数来指定编译输出文件的文件名。

在这个程序中,最重要的就是 pintf() 这个函数,它用于在屏幕上输出一段字符串。要使用这个函数,必须在开头写上 #include <stdio.h>,这一行的作用可以去看 [“#include ”的作用是什么? - 知乎](https://www.zhihu.com/question/373991876)。

像”Hello, world.\n”这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。注意,程序的运行结果并没有双引号,printf打印出来的只是里面的一串字符Hello, world.,因此双引号是字符串字面值的界定符,夹在双引号中间的一串字符才是它的内容。

注意,打印出来的结果也没有\n这两个字符,这是为什么呢?C语言规定了一些转义序列(Escape Sequence),这里的\n并不表示它的字面意思,也就是说并不表示\和n这两个字符本身,而是合起来表示一个换行符(Line Feed)。例如我们写三条打印语句:

printf("Hello, world.\n");
printf("Goodbye, ");
printf("cruel world!\n");

运行的结果是第一条语句单独打到第一行,后两条语句都打到第二行。C标准规定的转义字符有以下几种:

表 2.1. C标准规定的转义字符

转义字符 作用
' 单引号’(Single Quote或Apostrophe)
" 双引号”
\? 问号?(Question Mark)
|反斜线\(Backslash)  
\a 响铃(Alert或Bell)
\b 退格(Backspace)
\f 分页符(Form Feed)
\n 换行(Line Feed)
\r 回车(Carriage Return)
\t 水平制表符(Horizontal Tab)
\v 垂直制表符(Vertical Tab)

参考