C语言入门---程序结构

2018-03-26作者:马磊 等 著编辑:Solomon

在计算机中,程序是被一句一句执行的。C 语言中安排了三种结构来组织这样一句一 句的程序,分别为顺序结构、分支结构和循环结构。使用这三种结构,可以完成任何复杂 的程序,这三种结构也是写复杂 C 语言程序的基础。


一、简单语句

在 C 语言中,语句就是能够独立完成一个简单功能的基本构成单位。程序是由一条条 的语句组成和执行的,每一条语句完成一个基本的功能。最基础的不可再分的 C 语言语句 被称为简单语句。之前,已经见过好多 C 语言的简单语句了。例如,“radius = 3;”就是一条简单语句。 C 语言中常见的简单语句有 4 种:表达式语句、空语句、控制语句和函数调用语句。先来 介绍两种简单的语句:表达式语句和空语句。其他的语句形式和作用将在讲解完相应的知 识点之后再作介绍。


 未标题-1.jpg


1.1、表达式语句


           表达式语句就是在表达式后面加分号构成的语句,形式如下:

           表达式 ; 

           像这样的表示,就构成了一条表达式语句,可以在程序中完成一定的功能。例如,下

面就是曾见过的表达式语句,只是当时并没有给出具体的名字而已。

           radius = 1;

           10/5;

            ~-2;


该程序中,第一个语句就是一个赋值表达式语句,它完成的功能就是把 1 赋值给变量 radius。第二个语句是一个除法运算表达式语句,它完成 10 除以 5 的运算。第三个语句是 按位取反表达式语句,它计算–2 按位取反的结果。


 这些我们所熟悉的赋值运算、除法运算、按位取反运算所组成的赋值语句、除法运算

语句、按位取反语句,都属于表达式语句。


1.2、空语句


空语句在 C 语言中很少用到,它的作用就是什么都不干,让计算机空转,它的主要目 的就和我们军训的时候原地踏步是一样的,是为了暂时等待其他的东西先完成。

空语句的形式为一个简单的“;”,其他什么都没有: ;一个单独的分号就是告诉计算机,先等一等,在此暂留一步,然后再往下执行其他的语句。


二、语句块


语句块有时也被称为复合语句。之所以叫它复合语句,是因为它是由其他简单语句组

成的,看着像一块语句,所以也叫语句块。


2.1、语句块的形式


C 语言中的语句块是由一对大括号和其中包含的若干条语句组成的,形式如下所示:若要写一个包含几个表达式语句和空语句的语句块,就可以用下面的形式:这是一个语句块的例子,其中包含四个已经了解的语句,依次为赋值表达式语句、空语句、除法运算表达式语句和按位取反表达式语句。

         {

                 语句 1;

                 语句 2; 

                  ...

                 语句 n;

          }

     若要写一个包含几个表达式语句和空语句的语句块,就可以用下面的形式:

          {

                 radius = 1;

                  ;

                  10/5;

                   ~-2;

           }

    这是一个语句块的例子,其中包含四个已经了解的语句,依次为赋值表达式语句、空

    语句、除法运算表达式语句和按位取反表达式语句。


2.2、语句块的嵌套


C 语言中的语句块中是可以包含语句块的,叫做语句块嵌套。语句块中的语句块被当

作一个简单的语句来处理。例如,下面是一个语句块嵌套的包含表达式语句和空语句的例子。

           {

                radius = 1;

                    ; 

            {

                 10/5;

                  ~-2; 

                  }

              }

这个程序中的语句块稍微有点复杂,语句“10/5;”和“~-2;”这两个语句被大括号括 起来组成了一个语句块,这个语句块又和“radius = 1;”、“;”一起被另一个大括号括了 起来,组成了一个更复杂的语句块。


三、变量的作用域


在 C 语言中,变量的作用域就是可以使用这个变量的范围。每个变量都是有作用域的, 如果变量在作用域之外,我们就不能使用它了,否则就会出错。这就好比,你的孩子在家 的时候,你可以喊“Baby”,他会马上跑过来,但是你的孩子去外婆家了,你再喊“Baby”, 就没人答应了。

在 C 语言中,常见的变量都是在语句块里声明定义的,这些变量被称为局部变量。局 部变量在 C 语言中的使用要遵循下面三个规则。


3.1、 局部变量的声明定义位置规则


C 语言规定,变量的声明定义必须位于该语句块中的所有语句之前。也就是说一个语


句块的最合理的形式为:最前面全是局部变量的声明定义,后边全是语句,就像下面这样:


          {

                  变量声明定义 1;

                  变量声明定义 2; ... 变量声明定义 n;

                   语句(或语句块)1; 语句(或语句块)2;

                   ... 

                   语句(或语句块)n;

             }


在上面的格式中,变量的声明定义的次序可以无论先后。但是,变量的声明定义绝对

不能位于语句之后,否则开发工具将会告诉你编译出错。例如,下面的这个程序就违反了这个规则,导致编译出错。          

               #include<stdio.h>

               int main() 

                 {

                                  {

                                       int radius;

                                        radius =1;

                                        int result;

                                        result = 3*radius;

                                   }

                                 return 0; 

                    }




在程序进行编译的时候出现编译错误信息,如图 4.1 所示。这是由于在语句块中,变量 result 的声明定义位于赋值语句之后导致的。只要将 result 整型变量的声明定义放到赋值 语句 radius=1 之前,就满足上面的规则了,也就不会出现这样的错误了,不信,可以试 一试!


3.2、局部变量的作用域规则


正确地在语句块中声明定义局部变量以后,来看看关于局部变量的作用域规则:局部 变量的作用域为它所在的语句块,也就是局部变量只有在它声明定义的语句块中是可以使 用的,出了这个语句块范围,再使用这个变量将会出错。从语句块的构成来看,局部变量的作用域就是它所在的一对大括号之间,出了这个大括号再使用这个变量就会出现错误。例如,下面的代码就犯了这个错误。


               #include<stdio.h>

               int main() 

                 {

                                  {

                                       int radius;

                                        radius =1;

                                        int result;

                                        result = 3*radius;

                                   }

                                 return 0; 

                    }


在程序中,在一个语句块中声明定义了两个变量。但是,在语句块外面的一个赋值运 算语句“resutl=3*radius;”中使用了这两个变量,结果导致了错误,如图 4.2 所示。“radius” 和“result”是未声明的标识符。


3.3、嵌套语句块的同名变量作用域规则


我们知道一个局部变量的作用域为它所在的语句块之中。对于一个嵌套的语句块,如 果外面的语句块和里面的语句块都有一个同样名字的局部变量,那该怎么办?就像下面所示:

                            {

                                 A 变量声明定义;

                                    {

                                 A 变量声明定义;

                                 A 的操作语句; 

                                    }

                                }

嵌套语句块内外都有 A 的声明定义,那么里面 A 的操作语句到底是对哪个 A 进行操 作的呢?

C 语言使用的规则为:就近原则。也就是说代码“A 的操作语句”,使用的是里面的 语句块的变量 A。这就好像,家里有两个孩子,一个在客厅,一个在卧室,你在卧室喊了 声“Baby”,肯定是卧室的孩子会向你跑来。可以使用下面的程序来验证一下这个规则:

                             #include<stdio.h>

                              int main() 

                             {

                                  {

                                int i;

                                i = 1;

                                          {

                                int i; i = 10;

                                 i--;

                                 printf("%d ",i);

                                          }

                                 i++;

                                 printf("%d ",i);

                                     }

                                 return 0;

                               }


程序中,有一个嵌套的语句块。内外的语句块中都声明定义了一个整型变量 i,外面 的 i 赋值为 1,并对其进行自增运算,里面的 i 赋值为 10,并对其进行自减运算,然后分 别使用printf()函数输出结果。程序的结果为 9 和 2,如图 4.3 所示,符合上面所述的“就 近原则”。


四、最常见的语句执行结构——顺序结构


在 C 语言中,语句的组织是可以按照不同的方式进行的,对于每一种方式组织的语句, 执行顺序都是不同的。顺序结构是其中最简单的组织方式,它是按照程序中 C 语言语句的 顺序一句一句地执行的。


4.1、顺序结构的一般形式


顺序结构在 C 语言程序中的形式如下所示,一条语句接着一条语句往下写:


        语句 1;

        语句2 ;


         ...

        语句 n-1;


        语句 n;


假设,程序中有 n 条语句,并且是按照顺序结构组织的,那么,程序就会从第一条语 句开始一直顺序地执行到第 n 条语句。


4.2、顺序结构的例子 


看看实际的顺序结构的例子吧,下面的程序有好几条语句,它们都是按照顺序结构组织的。

                            #include<stdio.h>

                                  int main() 

                            {

                                   int i = 0;

                                    printf("%d ",i);

                                    i++;

                                    printf("%d ",i);

                                    i = 5;

                                    printf("%d ",i);

                                    i++;

                                    printf("%d ",i);

                                    return 0; 

                                }

程序中写了两个赋值语句和两个 i++自增表达式语句。它们是按照顺序结构的方式组 织的,一条在另一条之后,程序的输出如图 4.5 所示。从程序输出中可以看出,顺序结构 组织的语句确实是一条一条地执行的。程序先输出了一个 0,表示初始化赋值语句已经执行。接下来程序输出为 1,表示 i 自增运算已经完成。再接着程序输出为 5,表示 i 赋值为 5 语句执行成功。最后程序输出 为 6,表示 i 再一次自增成功。这正是顺序结构程序执行的顺序。


关注微信公众号“ 书问 ”,免费领取万本好书



内容来源:书问

作者马磊 等
出版清华大学出版社
定价49元
书籍比价

分享到

扫描二维码 ×

参与讨论

电子纸书

C语言入门1.2.3——一个老鸟的C语言学习心得

周凌霄, 编著
清华大学出版社[2014] ¥39

C语言从入门到精通(实例版)(第2版)

明日科技 著
清华大学出版社[2017] ¥48

C语言从入门到精通(第3版)

明日科技
清华大学出版社[2017] ¥36

C语言从入门到精通(第2版)

明日科技, 编著
清华大学出版社[2012] ¥25

C语言从入门到精通(实例版)

明日科技, 编著
清华大学出版社[2012] ¥35

C语言入门很简单

马磊 等 著
清华大学出版社[2012] ¥20

C语言开发入门及项目实战

明日科技, 编著
清华大学出版社[2012] ¥24

C语言程序设计——零基础ACM/ICPC竞赛实战指南

王建芳, 编著
清华大学出版社[2015] ¥21

C语言程序设计基础与应用

刘丽, 朱俊东, 张航, 编著
清华大学出版社[2012] ¥23

8051单片机C语言程序设计与实例解析

刘海涛, 赵金波, 晁阳, 编著
清华大学出版社[2009] ¥13

出版业领先的TMT平台

使用社交账号直接登陆

Copyright © 2018 BookAsk 书问   |   京ICP证160134号


注册书问

一键登录

Copyright © 2018 BookAsk 书问   |   京ICP证160134号