C语言学习指南:从规范编程到专业级开发
上QQ阅读APP看书,第一时间看更新

2.2.4 了解C语言的各种语句

在C语言里面,语句是程序的基本单位,每条语句都是一个完整的逻辑单元。语句可以分成许多类,每一类语句都有可能包含多项要素:

简单语句(simple statement):以;结尾的语句,例如return 0;就是一条简单语句。

块语句(block statement)[1]:以{开头并以}结尾的语句。这种语句可以包含其他一些语句。笔者在本书中会用{...}来表示块语句,...用来指代其中所包含的一条或多条有效语句。

复杂语句(complex statement):这种语句与简单语句相对应,由一个关键字以及一个或多个块语句构成。例如main() {...}就是一条复杂语句,它由main这个关键字以及其他几个要素按照预先规定的形式构成,其中一个要素是块语句,也就是{...}这一部分。函数、(某些)控制语句以及循环语句都属于块语句(函数会在本章讲到,控制语句和循环语句则分别会在第6章与第7章讲解)。

复合语句(compound statement):这种语句由多条简单语句或复杂语句所组成(其中复杂语句本身也可以包含许多条其他的语句)。例如我们这个Hello, world!程序的主体部分(也就是main()函数的那一对花括号里面的内容)就是一条复合语句,这条复合语句由两条简单语句构成,一条是函数调用语句,也就是为调用printf()函数而写的printf("Hello, world!\n");,另一条是返回语句,也就是return 0;。

我们的Hello, world!程序一共用到了下面几种语句(及指令):

预处理指令(preprocessor directive):这种指令以#开头并以<newline>(换行符)结尾。它在C语言里面,其实并不是严格意义上的语句,而是一种给编译器下达的命令(command),让编译器按照指定的方式处理某份C代码文件。预处理指令本身并不采用C语言的语法及格式来写,因此,我们虽然可以在C语言的程序代码里面使用这种指令,但它不为C语言的语法规则所约束。这种指令用来指示编译器在真正开始编译程序代码之前,要先执行一些额外的准备工作。

函数语句(function statement):main()函数是范例程序开始执行的地方,我们在此处所写的这条函数语句,其函数名称必须叫作main,这是C语言预先规定好的。我们可以向main()中添加其他语句以定义这个程序的逻辑。每个可执行的C程序都必须定义main()函数,而且只能定义一个。这条由main()所引领的函数语句是一条复杂语句。除了这种由main()所引领的函数语句之外,我们还可以定义自己的函数语句,为了说得简单一些,笔者以后就把定义或编写函数语句简称为定义或编写函数。

函数调用语句(function call statement):这是一种简单语句。操作系统需要调用main()函数以执行程序,而main()函数又应该调用C语言程序库中已经定义好的,或是由我们自己所定义的一些函数,以实现程序的功能。具体到Hello, world!程序来说,我们需要调用C语言程序库预先定义好的printf()函数来执行一些操作。遇到函数调用语句时,程序会从当前函数的当前语句跳转到受调用的函数(called function)那里,并开始执行那个函数中的代码。

返回语句(return statement):这也是一种简单语句,用来结束当前这个函数,并把执行权返回给调用者(caller,也就是调用当前函数的那个函数)。如果return语句出现在main()函数里面,那么意味着整个程序执行到这里就会结束,并且会把控制权返回给操作系统。

块语句(block statement):块语句是由一对花括号({})以及其中的一条复合语句所组成的,那条复合语句可以含有一条或多条其他语句。我们在编写函数语句及控制语句时需要用到块语句,这样的块语句或语句块称作命名块(named block),它们必须按照预先定义的一套结构来书写。另外,我们还可以直接把多条语句组合成一个块语句(而不拿它们来编写函数语句或控制语句),这种块语句或语句块称作无名块(unnamed block)。无名块的结构很简单不需要像函数语句或控制语句那样遵循一套固定的格式,凡是能够出现其他语句的地方都可以出现这种无名的语句块。在第25章,我们会详细讲解作用域(scope),到时笔者会解释语句块对作用域造成的影响,而在此之前,大家不用担心这个问题,因为我们采用的都是简单而直观的作用域规则。

为了将各种语句都涵盖到,我们也浅谈一下Hello, world!程序中没有出现的三种语句:

控制语句(control statement):if {} else {}语句、goto语句、break语句及continue语句都属于控制语句,另外,return语句(返回语句)也可以说是一种控制语句。与函数调用语句类似,这种语句也会影响程序的执行顺序。每一种控制语句都需要遵循预先规定的某套结构。我们将在第6章详细讲解这些语句。

循环语句(looping statement):while()...语句、do...while()语句以及for()...语句,都属于循环语句。它们跟控制语句类似,但重点在于迭代(iterate),也就是要把某段代码执行0次或多次。我们将在第7章详细讲解这些语句。

表达式语句(expression statement):这是一种简单语句,用来计算表达式并返回某种结果或值。我们将在第5章详细讲解这些语句。

除了刚说的控制语句、循环语句以及各种表达式语句外,Hello, world!程序其实已经把C语言里的各种关键语句都覆盖了。

我们在本章接下来的内容里会详细讲解这些语句。

[1] 也叫语句块(statement block)或代码块(code block),下同。——译者注