c语言是一种结构化的语言
可能读者以前就听说过,有一个计算机专用词汇叫做“block-structured”,也就是“块结构”。尽管块结构语言这个说法并不是很适合于c语言,但是c语言常常被简单的认定位块结构语言。的确,c语言与一些结构化的语言有很多相似之处,如ALGOL、Pascal和Modula-2。
注意:c语言之所以并不是严格技术意义上的块结构语言(c++也是如此),是因为块结构语言允许在过程或者函数中定义新的过程与函数,而c语言不允许这样做。因此,c语言并不是一种正宗的块结构语言。
结构化语言一个重要的特征就是代码和数据的分离。这使得语言有能力将一些实现特定任务的模块中的数据和指令划分出来,这些内容相对于程序的其它部分并不是可见的。实现数据分离的一种方法是使用子程序并在子程序中使用本地变量(即临时变量)。使用本地变量,你就可以写出对程序的其它部分没有任何副作用的子程序。这种能力,使得程序可以很简单的共享代码块。如果你使用模块化的函数编程方式,那么你只需要知道函数能够做什么,并不需要知道函数是如何实现的。要注意的是,过多的使用全局变量(一种在整个程序中可见的变量),会很容易导致程序出现bug,往往会有一些难以预料的副作用产生(相信很多使用BASIC编程的程序员都已经对这个问题有一定的认识)。
注意:数据分离的概念在c++中被扩展了。比如说,在c++中,程序中某个部分虽然允许被其它部分访问,但是会被更严格的控制。
结构化的编程语言会为你提供很多中编程方式。他们支持多中循环结构,如while、do-while和for循环。在结构化的编程中,goto语句不被禁止但是也不鼓励编程者使用。它在程序流程控制中不常用,例如BASIC和Fortran编程都是如此。结构化语言允许在一行的任意地方书写代码,这和老一些的FORTRAN语言编程的要求不一样。
以下是结构化和非结构化语言的一些例子:
非结构化语言 结构化语言
FORTRAN Pascal
BASIC Ada
COBOL Java
C#
C++
C
Modula-2
结构化语言看起来更现代一些。实际上区别老式计算机语言和现代计算机语言的一个标志就是,老式语言是非结构化的。今天的程序员几乎没有人会再使用非结构化的语言来编写新的应用程序了。
注意:有些老式语言的新版本也加入了一些结构化的元素,比如微软推出的Visual Basic就是BASIC语言向结构化发展的一个例子。尽管如此,这些非结构化语言中的一些缺陷也很难被彻底的改变,因为他们并非一开始就是以结构化的观点去设计语言的各种特性的。
c语言主要的构成部件是函数,函数是c语言中的子程序。在c语言中,函数就像堆砌成为房屋的一块块砖瓦,程序的任何行为都一定是在函数中发生的。这使得你可以为程序的不同任务编写互相分离的代码,因此,程序会变得模块化。当你创建了函数以后,你可以放心的是函数会恰当的在各种情况下运行而不会对程序的其它部分产生不应该的副作用。能够创建好的函数对于大型的工程来说是非常难得的,在大型的工程中,程序员必须确保代码不会对其它程序员的代码产生意外的影响。
c语言提供的另外一种使代码结构化的方式就是使用代码块。代码块就是一种在逻辑上被视为一个整体的一组语句。在c语言中,创建代码块的方法就是用大括号把一组有序的语句括起来。以下就是一个简单的例子:
if( x < 10 )
{
printf( "Too low, try again./n" );
scanf( %d, &x );
}
if语句下面被大括号括起的两句将会在x<10的情况下循环执行,这两个语句连同大括号一起就构成了一个代码块。代码块可以使得一些算法能够实现的清晰、高雅、高效。而且,还可以使程序员对这些算法的实现有更准确的概念。