编程学C(一)——C程序基本概念

主要内容:

程序设计语言概念基础

C程序基本概念

一、程序设计语言概念基础

语言是沟通交流的媒介,是由词汇按一定语法规则所构成的复杂的符号系统。自然语言的主体是人。自然语言是在人类劳动实践过程中不断丰富词汇、逐步形成和完善相应规则并不断发展的。

程序设计语言是人与计算机交互(人机对话)的媒介,一方面和人与人之间交流的自然语言存在某些相似(或越来越相近)的词汇与语法规则特性,另一方面又便于转换成计算机可以“理解”和执行的命令序列。越接近自然语言的程序设计语言越“高级”,越“靠近”计算机的语言越“低级”。当程序设计语言“高级”到跟自然语言差不多甚至涵盖自然语言功能时,计算机(机器人)就可以与人类自然沟通交流了,甚至可以为计算机赋予更多的“智能”。

程序设计语言必须用规定的符号系统并按照既定的规则准确无误地使用方为有效,这是目前它与人类自然语言的最大差别。

程序是存储于计算机中可被计算机识别并依序执行的指令(语句)集合。按照某种程序设计语言规则所编写的程序(编写程序的人可以理解的“语句”集合)经过相应的编译系统将其“翻译”成计算机能够理解和执行的指令集和。程序(Source Code,源程序)一般是一个个文本文件,可以用任何文本编辑器编写,绝大多数编译系统都自带编辑器。

C语言是经典高级语言的代表之一,同时又具有诸多“低级”语言的功能,允许直接访问物理地址,对硬件进行操作,具有丰富的“位”操作等。C语言是典型的结构化、模块化程序设计语言,具有简洁、紧凑,使用方便、灵活,代码执行效率搞、可移植性好等特点。在Windows操作系统下,常见的支持C语言的编译工具或开发环境有:TurboC、Visual C++ 6.0、Dev-C++、MinGW、CygWin、Microsoft Visual Studio(VS)系列,等等。在安卓手机系统下,可下载C4droid(会提示下载gcc)或“C++编译器”等作为编译器。

二、C程序基本概念

任何程序都有开始执行的地方(入口),并非千篇一律从源程序“第一行”开始(不然,万一源程序由多个文件组成呢),C程序总是从一个标识为main()的函数开始执行而无论该函数放在程序中的哪个位置(当然必须合规)或哪个源程序文件中。

1、最简单的一个C程序

下面先看一个C程序:

voidmain() { }

将该文本内容用后缀名为.c的形式保存,便可以编译运行,只是该程序运行过程中没有任何与使用者交互之处,既没有需要使用者操作的地方,也没有任何结果输出(显示),仅展示了该程序有C语言程序所必须的“入口”——main()函数。

2、函数基本概念

在C语言中,所谓函数,其基本定义形式如下:

函数返回值类型 函数名(函数所需参数列表)

{

函数体内容

}

回看前述C程序的main()函数,其“函数返回值类型”为void,意为“空”,表示该函数不需要返回值;其“函数所需参数列表”为空,表示该函数不接收任何参数(或对该函数的输入);花括弧{ }中的“函数体内容”为空,表示该函数不执行任何具体操作。

接下来,看第二个程序:

#include

int main()

{

printf(“Hello World!”);

return 0;

}

该程序执行时将会输出(一般为“在显示屏上显示”)如下信息:

HelloWorld!

看看该main()函数,前面返回值类型变成了int,说明C中的main()函数既可以选择无返回值类型void,也可以选择为有返回值类型int的。选择有返回值类型时,该函数运行结束时必须用return语句明确返回相应类型的值,如上述程序中的“return 0;”。一般情况下,可以设置返回0表示程序正常结束,若遇非正常情况,一般选择返回其他整数值(可自己定义)。

该程序的main()函数中,“执行”(调用)了printf()函数,该函数接收了一个用双引号引起来的字符串,结果是将该字符串内容输出。但printf()是个什么样的函数呢?

3、头文件与库函数

C语言(或多数语言)中,对于变量、函数等都遵循“先声明、再使用”的原则,因此要使用printf()函数,也需先有其声明(返回值类型、参数列表等)。

此处的printf()函数是标准C(ANSI C最早,其后有ISO关于C标准的1989年版——C89,以及后来的C99、C11)所规定的所有C(或支持C的)编译环境所必须提供的函数(称为“库函数”)之一,该函数的类型声明放在一个叫”stdio.h”的文本文件(一般位于C编译软件某个层次的名为include的子目录)中。该类以“.h”的文件称为“头文件”(Head File),主要用于存放函数的声明和相关定义,供多个源文件共享使用。

按照C标准规定,支持C的环境均提供了大量的“标准化”的函数支持,并根据作用不同分别放在不同的“头文件”中,如上述stdio.h文件中就主要包含了常用的标准输入、输出函数等。

使用库函数时,需要事先(一般在当前文件最开始部分)“包含”相应头文件,如上述程序中的:

#include

简单来讲,就是告诉系统在编译程序时,将stdio.h文件的内容替换至此处,其中关于printf()函数的声明自然也就有了。

根据需要,可以自建相应的头文件(其实,在面向对象程序设计中,推荐甚至要求将相关声明与定义分离)。

4、源程序的“翻译”过程

一个由程序设计者理解的C程序怎样“翻译”成计算机可以理解并执行的程序呢?主要包含以下两个过程:

(1)编译(Compiling):把编写成功的源程序编译成计算机可识别的二进制文件——“目标文件”(如:*.o, *.obj);

(2)连接(Linking):把多个(如果有的话)源程序文件编译后的多个目标文件以及源程序中所使用或调用的但非本程序定义相关内容的二进制文件进行连接,形成一个可以运行的文件(如:*.exe)。

例如,前述程序中调用了库函数printf(),而该函数的具体实现,是以二进制形式存放于编译系统指定的“库”文件中(库文件一般存放在某个层次的名为lib的子目录中)。在连接时,系统会自动在相应的库中寻找printf()的实现代码(二进制)进行“连接”以保证运行。

当然,根据程序(软件)的规模及实际需求,你也可以自建库文件。对于“库”的使用,除了在生成可执行文件前的连接阶段使用,还可以在运行阶段再去“连接”(“链接”)相应的“库”——“动态链接库”(*.DLL)。

至此,我们了解了一个C程序从编写到运行的基本过程、调用系统已提供的“库函数”的使用基本原理以及相关概念。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180911G01KJF00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券