《C程序设计伴侣》试读:1.3 C语言真正的特点及其演变

时间:2022-01-26 23:34:57
更多试读:
http://chenlq.net/books/c-mate/c-mate-intro.html

C语言的发展及其特点

1.3 C语言真正的特点及其演变

在这一小节中,谭老师简要地介绍了C语言的发展历程,让我们认识到C语言是一门历史悠久的程序设计语言,从最初的只是为了描述和实现UNIX的需要而设计的一种工作语言,到后来得到业界的广泛认同而逐渐成为一种流行的程序设计语言。它的流行,也证明了其鲜明的特点让它具有了旺盛的生命力,C语言已经流行,并且还将继续流行,它始终是一门应用广泛的主流程序设计语言。(这句话的潜台词是,学习C语言大有“前/钱”途。)

C语言能够受到大家的欢迎和认可,能够在软件业界广泛流行,这不是偶然的,是由它的鲜明的程序设计特点决定的。谭老师总结了C语言的8个特点,从“语言简洁、紧凑,使用方便、灵活”到“运算符丰富”,从“具有结构化的控制语句”到“语法限制不太严格,程序设计*度大”等等。

没错,这些确实是C语言的特点,但是,真正让C语言能够在众多的程序设计语言中屹立不倒的特点只有两个:

l 接近底层,可以直接对硬件进行操作

严格地说,C语言是一种介于低级程序设计语言(例如,汇编语言)和高级程序设计语言(例如,C++、Java)之间的中级程序设计语言。它把高级语言的基本结构和语句与低级语言的实用性结合起来,这使得程序员可以非常容易地利用C语言直接对计算机的硬件单元位、字节和地址进行操作。这样的特点,决定了C语言在某些需要对硬件进行操作的应用场景下,例如嵌入式系统中,成为程序员们的不二之选。

l 执行效率高,具有接近汇编的性能

除了汇编语言之外,C语言应该是当今主流程序设计语言中,执行效率最高的程序设计语言了。一般而言,经过编译器优化后的C语言程序,其执行效率只比汇编程序生成的目标代码效率低10%~20%。对于某些对性能要求极高的系统软件,诸如Linux内核、搜索引擎算法,以及大型的科学计算程序等等,恐怕只有C语言才能够胜任。这也决定了C语言在这些领域具有长久的生命力,始终处于一种无可替代的地位。

事物都有两面性,C语言的优点非常突出,但相对于那些高级程序设计语言,其缺点也非常明显。

l 数据封装性不强

C语言的一个重要的缺点就是它对数据的封装性不强,基本上,在程序中我们可以对任何数据进行任意的访问,而不管这个数据是关键的重要数据还是某个无关紧要的临时数据。这一点使得C语言在数据的安全性上有很大缺陷,这也是C语言和C++语言的一大区别。

l 结构化的程序设计语言,无法支持复杂的大型业务型系统的开发

C语言是一种优秀的结构化程序设计语言,可以很好地实现程序代码及数据的相互分离,利于程序的开发和维护。出于性能的需求,它也被用于构建一些底层系统(例如Linux kernel)。但是,在开发一些更加复杂的业务型系统的时候,因为其抽象层次比较低,这样的设计方法却可能让整个项目陷入“需求变化”的深渊,一旦需求发生变化,则可能需要对整个系统的设计进行变更,这使得C语言无法很好地支持复杂的大型系统的开发,极大地限制了C语言的应用。这也是为什么后来出现了面向对象的设计思想以及C++语言。

l C语言语法灵活,须了解更多软硬件知识,难以掌握

C语言的理念与UNIX系统以及Hacker精神是一脉传承的:程序员应该对他自己的行为负责。因此没有在语言层级上做过多的约束。保持语言的强大、简洁、灵活是优先考虑的,而不是对初学者的亲和度。正是因为贯彻着这样的精神,C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。因为其灵活性,尤其加之须对软硬件特点有更多了解(难在语言层面之外),使得从应用的角度,C语言比其他高级语言较难掌握,这也限制了C语言的应用普及。

clip_image002

优点对缺点,半斤对八两

这样看来,C语言是一种优点和缺点都非常突出的程序设计语言,就像一个个性过于突出的人一样,一面是天使,一面是魔鬼。我们只有对C语言的优点和缺点都有一个全面而清晰的认识,才能真正理解C语言,把握C语言的个性,充分利用好C语言的优点,尽量避免C语言的缺点,让C语言在合适的应用场景下发挥最大的作用。

13 个解决方案

#1


每种语言都有优缺点,宁可特点突出,也绝不要巨无霸语言。

#2


引用 1 楼  的回复:
每种语言都有优缺点,宁可特点突出,也绝不要巨无霸语言。

赞同
觉得Java,C#之类的就有点巨无霸了

#3


题目很大,内容就不敢恭维了
http://chenlq.net/books/c-mate/partner-probation-c-programming-4-8-a-guessing-game.html
里面有这么几句代码

        // 采用循环结构,逐个字符比对输入数字(cow)和目标数字(bull)
        for(int i = 0; i<4; ++i)
        {

这个for分明是C++的语法,C语言是不支持这样的语法的。

#4


引用 2 楼  的回复:
引用 1 楼  的回复:

每种语言都有优缺点,宁可特点突出,也绝不要巨无霸语言。

赞同
觉得Java,C#之类的就有点巨无霸了

C++才是真正的巨无霸语言。

#5


引用 3 楼  的回复:
题目很大,内容就不敢恭维了
http://chenlq.net/books/c-mate/partner-probation-c-programming-4-8-a-guessing-game.html
里面有这么几句代码

        // 采用循环结构,逐个字符比对输入数字(cow)和目标数字(bull)
        for(int i = 0; i<4; ++i)
  ……

C99 支持

#6


引用 5 楼  的回复:
C99 支持

VS都不支持C99

#7


引用 3 楼  的回复:
题目很大,内容就不敢恭维了
http://chenlq.net/books/c-mate/partner-probation-c-programming-4-8-a-guessing-game.html
里面有这么几句代码

        // 采用循环结构,逐个字符比对输入数字(cow)和目标数字(bull)
        for(int i = 0; i<4; ++i)
  ……

C99支持的

#8


引用 6 楼  的回复:
引用 5 楼  的回复:

C99 支持

VS都不支持C99

VS使用一些特殊的编译选项,也可以支持

#9


引用 8 楼  的回复:
引用 6 楼 的回复:

引用 5 楼 的回复:

C99 支持

VS都不支持C99

VS使用一些特殊的编译选项,也可以支持


这个特殊的编译选项就是/TP吧……把源代码当成C++……
《C程序设计伴侣》试读:1.3 C语言真正的特点及其演变

#10


另一个选项/Zc:forScope,不是用来处理这种情况的,而是为了处理VC6的C++不标准行为的,VC6的for内int作用域会一直持续,而C++标准规定只在for循环内,VS的这个选项可以选择VC6的行为还是C++标准行为,因此没有方法能让VC支持纯C下的for语句内声明

#11


今天刚去过LZ的博客。。。

#12


做个可能不太恰当的比喻:
人想让狗帮忙逮只兔子,可是人说话狗听不懂,于是人发明了一种介乎人言和狗语之间的语言,即口令。
人想让电脑帮忙做计算,可是人话电脑听不懂,于是人发明了一种介乎人言和汇编机器码之间的语言,即C语言。
人对狗的口令得让人容易学、也得让狗容易懂。
C语言同样得让人容易学、也得让电脑容易懂。
相比之下C++、Java就是人学得费劲、电脑也经常闹不懂。

#13


引用 9 楼  的回复:
引用 8 楼  的回复:
引用 6 楼 的回复:

引用 5 楼 的回复:

C99 支持

VS都不支持C99

VS使用一些特殊的编译选项,也可以支持


这个特殊的编译选项就是/TP吧……把源代码当成C++……


没办法,只能使用一些变通的方法

#1


每种语言都有优缺点,宁可特点突出,也绝不要巨无霸语言。

#2


引用 1 楼  的回复:
每种语言都有优缺点,宁可特点突出,也绝不要巨无霸语言。

赞同
觉得Java,C#之类的就有点巨无霸了

#3


题目很大,内容就不敢恭维了
http://chenlq.net/books/c-mate/partner-probation-c-programming-4-8-a-guessing-game.html
里面有这么几句代码

        // 采用循环结构,逐个字符比对输入数字(cow)和目标数字(bull)
        for(int i = 0; i<4; ++i)
        {

这个for分明是C++的语法,C语言是不支持这样的语法的。

#4


引用 2 楼  的回复:
引用 1 楼  的回复:

每种语言都有优缺点,宁可特点突出,也绝不要巨无霸语言。

赞同
觉得Java,C#之类的就有点巨无霸了

C++才是真正的巨无霸语言。

#5


引用 3 楼  的回复:
题目很大,内容就不敢恭维了
http://chenlq.net/books/c-mate/partner-probation-c-programming-4-8-a-guessing-game.html
里面有这么几句代码

        // 采用循环结构,逐个字符比对输入数字(cow)和目标数字(bull)
        for(int i = 0; i<4; ++i)
  ……

C99 支持

#6


引用 5 楼  的回复:
C99 支持

VS都不支持C99

#7


引用 3 楼  的回复:
题目很大,内容就不敢恭维了
http://chenlq.net/books/c-mate/partner-probation-c-programming-4-8-a-guessing-game.html
里面有这么几句代码

        // 采用循环结构,逐个字符比对输入数字(cow)和目标数字(bull)
        for(int i = 0; i<4; ++i)
  ……

C99支持的

#8


引用 6 楼  的回复:
引用 5 楼  的回复:

C99 支持

VS都不支持C99

VS使用一些特殊的编译选项,也可以支持

#9


引用 8 楼  的回复:
引用 6 楼 的回复:

引用 5 楼 的回复:

C99 支持

VS都不支持C99

VS使用一些特殊的编译选项,也可以支持


这个特殊的编译选项就是/TP吧……把源代码当成C++……
《C程序设计伴侣》试读:1.3 C语言真正的特点及其演变

#10


另一个选项/Zc:forScope,不是用来处理这种情况的,而是为了处理VC6的C++不标准行为的,VC6的for内int作用域会一直持续,而C++标准规定只在for循环内,VS的这个选项可以选择VC6的行为还是C++标准行为,因此没有方法能让VC支持纯C下的for语句内声明

#11


今天刚去过LZ的博客。。。

#12


做个可能不太恰当的比喻:
人想让狗帮忙逮只兔子,可是人说话狗听不懂,于是人发明了一种介乎人言和狗语之间的语言,即口令。
人想让电脑帮忙做计算,可是人话电脑听不懂,于是人发明了一种介乎人言和汇编机器码之间的语言,即C语言。
人对狗的口令得让人容易学、也得让狗容易懂。
C语言同样得让人容易学、也得让电脑容易懂。
相比之下C++、Java就是人学得费劲、电脑也经常闹不懂。

#13


引用 9 楼  的回复:
引用 8 楼  的回复:
引用 6 楼 的回复:

引用 5 楼 的回复:

C99 支持

VS都不支持C99

VS使用一些特殊的编译选项,也可以支持


这个特殊的编译选项就是/TP吧……把源代码当成C++……


没办法,只能使用一些变通的方法