C语言初探

一、编程语言

       编程语言是用来控制计算机的一系列指令(Instruction),它有固定的格式和词汇(不同编程语言的格式和词汇不一样),必须遵守,否则就会出错,达不到我们的某种目的。

       编程语言的发展大概经历了以下几个阶段:

汇编语言 --> 面向过程编程 --> 面向对象编程
  • 汇编语言是编程语言的拓荒年代,它非常底层,直接和计算机硬件打交道,开发效率低,学习成本高;
  • C语言是面向过程的编程语言,已经脱离了计算机硬件,可以设计中等规模的程序了;
  • Java、C++、Python、C#、PHP 等是面向对象的编程语言,它们在面向过程的基础上又增加了很多概念。

二、C语言与C++关系

       C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。在当时算是高级语言,它的很多新特性都让汇编程序员羡慕不已,就像今天的Go语言,刚出生就受到追捧。C语言也是”时髦“的语言,后来的很多软件都用C语言开发,包括 Windows、Linux 操作系统和 RDBMS(Relational Database Management System:关系数据库管理系统) MySQL 等等都是使用 C 语言编写的。

       但是随着计算机性能的飞速提高,硬件配置与几十年前已有天壤之别,软件规模也不断增大,很多软件的体积都超过 1G,例如 PhotoShop、Visual Studio 等,用C语言开发这些软件就显得非常吃力了,这时候C++就应运而生了。C++ 主要在C语言的基础上增加了面向对象泛型的机制,提高了开发效率,以适用于大中型软件的编写。随着C++的流行,它的语法也越来越强大,已经能够很完善的支持面向对象编程和泛型编程。但是一直也没有诞生出新的C++编译器,而是对原来C编译器不断扩展,让它支持C++的新特性,所以我们通常称为C/C++编译器,因为它同时支持C和C++。C和C++的关系见下图:

        总结:C++支持面向过程编程、面向对象编程和泛型编程,而C语言仅支持面向过程编程。就面向过程编程而言,C++和C几乎是一样的,如果学习了C语言,也就学习了C++的一半,不需要从头再来。

三、第一个C语言程序

#include <stdio.h>
#include <stdlib.h>
int main()
{
	/*第一个C语言程序*/
	puts("您好,世界!");//只能输出字符串
	printf("Hello,World! \n");
	system("pause");
	return 0;
}

       接下来讲解一下上面这段代码:

1. 程序的第一行 #include <stdio.h> 是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件。引入头文件使用#include命令,并将文件名放在< >中,#include 和 < > 之间可以有空格,也可以没有,头文件以.h为后缀。
   实际上,头文件往往只包含函数的说明,也就是告诉我们函数怎么用,而函数本身保存在其他文件中,在链接时才会找到。
2. 第二行#include <stdlib.h>
3. int main() 是主函数,程序从这里开始执行。这是我们自己编写的一个函数。main 是函数的名字,( ) 表明这是函数定义,{ } 之间的代码是函数要实现的功能。
   需要注意的是,自定义函数必须命名为 main。C语言规定,一个程序必须有且只有一个 main 函数。main 被称为主函数,是程序的入口函数,程序运行时从 main 函数开始,直到 main 函数结束(遇到 return 或者执行到函数末尾时,函数才结束)。
4. /*...*/ 将会被编译器忽略,这里放置程序的注释内容。它们被称为程序的注释。
5. puts(...) puts是output string的缩写,意思是“输出字符串”。在C语言中,字符串需要用双引号""包围起来。
6. printf(...) 是 C 中另一个可用的函数,会在屏幕上显示消息 "Hello, World!"。
7. system("pause");暂停
8. 下一行 return 0; 终止 main() 函数,并返回值 0。
9. 在C语言中,使用分号 ; 表示一个语句的结束,在一个完整的语句后面加上分号 ; ,表示当前语句结束了。
10.stdio 是 standard input output 的缩写,stdio.h 被称为“标准输入输出文件”,包含的函数大都和输入输出有关,puts() 就是其中之一。
stdlib 是 standard library 的缩写,stdlib.h 被称为“标准库文件”,包含的函数比较杂乱,多是一些通用工具型函数,system() 就是其中之一。

       将上述代码保存到一个文件中,这种用来保存代码的文件就叫做源文件(Source File,.cpp文件),源文件其实就是纯文本文件,它的内部并没有特殊格式。每种编程语言的源文件都有特定的后缀,以方便被编译器识别,被程序员理解。如C语言源文件的后缀是.c,C++语言源文件的后缀是.cpp,Python语言源文件的后缀是.py。对于我们编写的源文件CPU根本不认识,因为CPU只认识几百个二进制形式的指令。这就需要一个工具,将C语言代码转换成CPU能够识别的二进制指令,也就是将代码加工成 .exe 程序的格式。这个工具是一个特殊的软件,叫做编译器(Compiler)。编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译(Compile)。C语言代码经过编译以后,并没有生成最终的可执行文件(.exe 文件),而是生成了一种叫做目标文件(Object File,.obj文件)的中间文件(或者说临时文件)。目标文件也是二进制形式的,它和可执行文件的格式是一样的,对于 Visual C++,目标文件的后缀是.obj;对于 GCC,目标文件的后缀是.o。目标文件经过链接(Link)以后才能变成可执行文件(.exe文件)链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)

       总结上述整个过程:不管我们编写的代码有多么简单,都必须经过「源文件-->编译 --> 链接」的过程才能生成可执行文件:

  • 编译就是将我们编写的源代码“翻译”成计算机可以识别的二进制格式,它们以目标文件的形式存在;
  • 链接就是一个“打包”的过程,它将所有的目标文件以及系统组件组合成一个可执行文件;
  • 编译是针对一个源文件的,编译器每次只能编译一个源文件,生成一个目标文件。有多少个源文件就需要编译多少次,就会生成多少个目标文件。当有多个目标文件时,链接器除了将目标文件和系统组件组合起来,还需要将编译器生成的多个目标文件组合起来。

四、C语言编译器

C语è¨ç¼è¯å¨çåç±»

       通过上面的图可以发现,C语言有众多编译器,归其原因是C语言并没有一个官方机构,也不属于哪个公司,它只有一个制定标准的委员会,任何其他组织或者个人都可以开发C语言的编译器,而这个编译器要遵守哪个C语言标准(C89、C90、C99、C11),是 100% 遵守还是部分遵守,并没有强制性的措施,也没有任何约束。换句话说,各个厂商可以为了自己的利益、根据自己的喜好来开发编译器。

       这就导致了一个棘手的问题,有的编译器遵守较新的C语言标准,有的编译器只能遵守较老的C语言标准,有的编译器还进行了很多扩展。比如:GCC、LLVM/Clang 更新非常及时,能够支持最新的 C11 标准(前提是你得使用最新版的编译器);微软编译器更新比较缓慢,迟迟不能支持新标准,例如 VC 6.0、VS2010 都在使用 C89 标准,VS2015 部分支持 C99 标准(其他版本的VS没有测试)。微软官方给出的答复是,最新的标准已经在 C++ 中支持了,C语言就没必要再重复了。

       所以经常会遇到这种情况,有些代码在微软编译器下能够正常运行,拿到 GCC 下就不行了,一堆报错信息;或者反过来,在 GCC 上能运行的代码在微软编译器下不能运行。这是因为不同的编译器支持不同的标准,并且每个编译器都进行了自己的扩展,假如你使用了微软编译器私有的扩展函数,那么拿到 GCC 下肯定是不支持的。

 

 

 

参考文献:C语言中文网

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值