说到C语言就得说说盘古开天辟地那点事了。盘古开了天,C语言就在开天后的很多年出现在了人们的面前,给人们带来了新的生活方式。
C语言的演变过程
UNIX 系统是世界上第一个真正的操作系统。由于 UNIX 操作系统是用C语言编写的,而这个系统很流行,于是C语言也跟着流行起来。而 UNIX 操作系统是开源的,所以别人要想学习,就要先学C语言。
B语言被C语言改写后,C语言流行了而B语言就被淘汰了。而且后来发现,C语言的确非常好,它是面向过程语言的代表,是有史以来最重要的一门计算机语言。
随后又出现了 C++。C++ 是本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)编写的,他也来自贝尔实验室,是C语言创始人丹尼斯·里奇的下属。C++ 就是在C语言的基础上发明的。C++ 进一步扩充和完善了C语言,是一种面向对象的程序设计语言。
后来 Sun 公司又对 C++ 进行改写,产生了 Java。而微软公司发现 Java 很流行,就造出了一个类似的语言——C#。所以 Java 和 C# 都源自于 C++。
从这个过程我们可以看出,如果以后要学习C++、Java或者C#的话,那么C语言就必须要学!因为它们都源自于C语言。而且C语言中绝大部分的知识,在C++、Java、C#中几乎都会用到。C语言里面有两个知识点是必须要学的,一个是函数,另一个是指针。这两个知识点是整个C语言的主体和核心。而且这两个知识点在其他语言中是学不到的,或者是同C语言中有差别。总之,C语言是它们的“老祖宗”,学习其他语言之前最好要将C语言学好。
C语言的优点
C语言的优点有三个:
- 代码量小。
- 运行速度快。
- 功能强大。
我们先看第一个优点,C语言的代码量很小,这是什么意思呢?也就是说如果你要完成同样一个功能,用C语言编写出来的程序的容量是很小的,而用其他语言编写容量就会比较大。比如Microsoft Word和WPS,它们同样都是办公软件,功能也差不多,但WPS的安装文件只有50MB左右,而Microsoft Word的安装文件超过500MB,有的甚至接近1GB。原因就是WPS的内核是用C语言编写的。
C语言的第二和第三个优点是它的运行速度比较快和功能强大,我们可以通过一个例子来解释。世界上总共有三大操作系统:UNIX操作系统是用纯C语言编写的;Windows操作系统的内核也是用C语言编写的; Linux操作系统仍是用纯C语言编写的。
这三大操作系统的内核全部都是用C语言编写的。为什么用C编写,因为C语言的速度最快。计算机中所有的软件都是在操作系统上运行的,如果操作系统的速度很慢,那么在它基础上运行的软件的速度就更慢了。
所以操作系统很重要,所有的硬件全部都是由操作系统控制的。而这么重要的东西只能用C语言来写,所以C语言很重要。为什么只能用C语言写?第一,C语言速度够快;第二,C语言可以访问硬件,所以它够强大。为什么不能用Java写?首先,Java太慢了;其次,Java语言没有指针。没有指针就不能访问硬件,所以它的功能是不够的。什么是指针以后再议,它是C语言中非常重要的内容。
C语言的缺点
任何语言有优点就有缺点。C语言的缺点可以用下面三点来概括:
- 危险性高。
- 开发周期长。
- 可移植性不强。
咱们呢先看第一点。假如你写同样一个程序,在Java里面会报错,而在C语言里面是不会报错的。为什么?因为C语言设计的思想是:你想怎么写程序就怎么写,只要你的这种写法错得不是很离谱,就认为你这么写有特殊的含义,可以通过。
大家想想这样导致的结果是什么?因为有歧义的程序也可以通过,这样就会有很多漏洞,黑客往往会抓住这些漏洞进行攻击。所以说C语言比较危险。这也是为什么C语言比较难学的原因,因为你学完之后编写一个程序很可能就是错的,但又很难发现。所以前面说C++从安全性上对C语言进行了升级。
第二个是它的开发周期比较长。因为C语言是面向过程的语言,面向过程语言的一个特点就是写大项目的时候很容易“崩溃”。当代码上到10万行的时候很容易崩溃,会出现各种各样莫名其妙的错误。这时候就需要用另外一种思想将整个程序的框架重新设计一下,即用面向对象的思想设计。这也是C语言现在没有Java流行的原因。
C语言的第三个缺点是可移植性不强。这个主要是针对Java的。Java的可移植性太强了,所以就显得C语言的可移植性不强。什么叫可移植性?就是说Java程序在哪个机器上都可以运行,而且结果一模一样。而C语言就不行,C程序在其他机器上不一定能运行。而且就算能运行,结果可能也不一样。
为什么要使用 C?
C 语言最初是用于系统开发工作,特别是组成操作系统的程序。由于 C 语言所产生的代码运行速度与汇编语言编写的代码运行速度几乎一样,所以采用 C 语言作为系统开发语言。下面列举几个使用 C 的实例:
1.系统软件开发
- 操作系统:UNIX、Windows、Linux。
- 驱动程序:比如主板驱动、显卡驱动、摄像头驱动。驱动一般是用C语言和汇编语言写的,C++在这方面稍弱。
- 数据库:SQL server、Oracle、MySQL、DB2。
2.应用软件开发
- 办公软件:WPS。
- 图形图像多媒体: Photoshop、Mediaplayer。
- 嵌入式软件开发:嵌入式软件开发说得简单点就是芯片编程,单片机和ARM上进行的开发都属于嵌入式软件开发。
- 游戏开发:2D、3D游戏。CS整个游戏的引擎全部是用纯C写的。
C语言的重要性
其实前面已经讲了很多C语言的重要性,下面来总结一下。
C语言是计算机界公认的有史以来最重要的语言。
C语言是所有大学工科和理科学生必修的课程。
UNIX、Windows、Linux都是用C语言开发的。
C语言是任何一个想终身从事程序设计和开发的人员必须要熟练掌握的语言之
C语言是大企业、外企招聘程序员必考的语言。
学习C语言可以为学习C++、Java、C#奠定基础。C++、Java、C#都源自C语言,C语言大部分的语法、知识都被移植到C++、Java和C#中了。所以学习C语言有助于C++、Java和C#的学习。对于学习编程的人来说,有深厚的C语言功底是极其重要的。只要C语言的功底深厚,那么学习其他语言都会很简单。但深厚的功底不是一天两天造就的,需要长时间的积累和沉淀!
C11
C11(也被称为C1X)指ISO标准ISO/IEC 9899:2011,是当前最新的C语言标准。在它之前的C语言标准为C99。
新特性
- 对齐处理(Alignment)的标准化(包括_Alignas标志符,alignof运算符,aligned_alloc函数以及头文件)。
- _Noreturn 函数标记,类似于 gcc 的 __attribute__((noreturn))。
- _Generic 关键字。
- 多线程(Multithreading)支持,包括:_Thread_local存储类型标识符,头文件,里面包含了线程的创建和管理函数。_Atomic类型修饰符和头文件。
- 增强的Unicode的支持。基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件。
- 删除了gets()函数,使用一个新的更安全的函数gets_s()替代。
- 增加了边界检查函数接口,定义了新的安全的函数,例如fopen_s(),strcat_s()等等。
- 增加了更多浮点处理宏(宏)。
- 匿名结构体/联合体支持。这个在gcc早已存在,C11将其引入标准。
- 静态断言(Static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。
- 新的 fopen() 模式,("…x")。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。
- 新增 quick_exit() 函数作为第三种终止程序的方式。当 exit()失败时可以做最少的清理工作。