1.2 C++程序

1.2 C++程序


      在C++中,动作被称为表达式(expression)。 以分号结尾的表达式被称作语句(statement)。
C++中最小的程序单元是语句,在自然语言中与此类似的结构就是句子。例如下面是一
组C++语句:


      int book_count = 0;
      book_count = books_on_shelf + books_on_order;
      cout << "The value of book_count: " << book_count;

      第一条语句是一个声明(declaration)。 语句book_count 被称为标识符(identifier) 或符
号变量(symbolic variable) ,简称变量或者对象(object), 它定义了计算机内存的一块
区域,并且与名字book_count 相关联,被用来存储整数值0 ,是一个文字常量(literal constant)。
book_count 被初始化为0。


      第二条语句是一个赋值(assignment) 语句。它把 books_on_shelf 和 books_on_order
的值相加,并把结果放入与book_count 相关联的计算机内存区域中。这里假定books_on_shelf 和
books_on_order 已经在前面的代码中被声明为整型并赋了初值。


      第三条是输出(output) 语句,cout 是与用户终端相关联的输出目标,<<是输出操作符。该语句向cout, 即用户终端先输出用引号括起来的字符串文字,然后输出存储在与名字books_count 相关联的内存区域中的值。假设此时books_count 中的值为11273, 那么输出结果为the value of book_count: 11273。


      把语句按逻辑语义分组就形成了一些有名字的单元,这些单元被称为函数(function)。例如把所有需要读取销售文件的语句组织到一个被称为readln()的函数中,类似地我们可以构成sort()、 compact()、和print()函数。在C++中每个程序必须包含一个被称作main()的函数,它是由程序员提供的并且只有这样的程序才能运行。下面是按前述算法定义的一种main()函数

        int main()
       {
            readIn();
            sort();
            compact();
            print();

 

            return 0;
       }

 

      C++程序从main()函数的第一条语句开始执行。在本例中程序从函数readln()开始,并且程序按顺序执行main()函数中的语句,在执行完main()函数的最后一条语句之后,程序正常结束。

 

      函数由四部分组成:返回类型、函数名、参数表以及函数体。前三部分合起来称为函数原型(function prototype)。参数表由小括号括起来,包含一个或多个由逗号分开的参数。函数体由一对花括号括起来由程序语句序列构成。

     在本例中main()函数的函数体调用invoke 函数 、readIn() 、sort()、 compact()和 print().
当这些函数调用都完成时下面的语句
    return 0

     将被执行。return 是C++预定义的语句,它提供了终止函数执行的一种方法,当return 语句提供了一个值时,例如0, 这个值就成为函数的返回值(return value),本例中返回值为0,表示main()函数成功执行完毕。标准C++中如果main()函数没有显式地提供返回语句则它缺省返回0。

 

     现在我们来看一下如果想让我们的程序能够执行起来,我们还需要做哪些准备工作。首先必须提供函数readln()、 sort()、 compact()以及print()的定义。下面的哑函数实例已经足够满足这个要求了

 

          void readIn() { cout << "readIn()/n"; }
          void sort() { cout << "sort()/n"; }
          void compact() { cout << "compact()/n"; }
          void print() { cout << "print()/n"; }

 

      void 用来指定一个没有返回值的函数。正如上面的定义所示,每个函数在被main()函数调用时,只会简单地在用户终端上显示它的存在,以后我们会用真正的实现函数来代替这些哑函数。这种渐进式生成程序的方法,为控制程序设计中不可避免的错误提供了一种有效的控制手段。试图一下子就能写出一个完全成功的程序几乎是不可能的,程序源文件的名字一般包括两部分文件名,例如bookstore 以及文件后缀,文件后缀一般用来标识文件的内容,比如文件
          bookstore.h

    在C 或C++中习惯上被称为头(header) 文件,标准C++头文件没有后缀,这是个例外。而以下文件

          bookstore.c

    习惯上被当作C 程序文本文件,但在UNIX 操作系统中以下文件
          bookstore.c

    习惯上被当作C++程序的文本文件,C++程序文件的后缀在不同的C++实现产品中是不同的,特别在DOS 中大写的字母C 与小写的字母c 是不能区分的。其他常用来识别C++程序文本文件的后缀还包括

    bookstore.cxx
    bookstore.cpp

    类似地头文件的后缀在C++的不同实现中也不相同,这也是标准C++没有指定头文件后缀的一个原因(请查阅你的编译器的用户指南以确定在当前平台上使用什么后缀)。使用某个文本编辑器将下面这段完整的程序输入到一个C++文本文件中

    #include <iostream>
    using namespace std;
    void read() { cout << "read()/n"; }
    void sort() { cout << "sort()/n"; }
    void compact() { cout << "compact()/n"; }
    void write() { cout << "write()/n"; }
    int main()
   {
       read();
       sort();
       compact();
       write();

 

       return 0;
   }

 

    iostream是输入输出流库标准文件,注意它没有后缀,它包含cout 的信息,这对我们的程序是必需的,#include 是预处理器指示符(preprocessor directive),它把iostream 的内容读入我们的文本文件中,1.3 节将讨论预处理器指示符在C++标准库中定义的名字,如cout 不能在程序中直接使用除非在预处理器指示符

 

   #include <iostream>

   后面加上语句

   using namespace std;

 

   这条语句被称作using 指示符(using directive)。 C++标准库中的名字都是在一个称作std 的名字空间中声明的,这些名字在我们的程序文本文件中是不可见的,除非我们显式地使它们可见,using 指示符告诉编译器要使用在名字空间std 中声明的名字,在2.7 和2.8 节中将更进一步讨论名字空间与using 指示符。

 

    程序已经被输入到文件如prog1.c 中之后,接下来就应将其编译。在Unix 系统中按以下步骤进行,$表示系统提示符
         $ CC prog1.C

 

    用来调用C++编译器的命令的名字在不同的实现中也不相同,在Windows 中通常通过选择菜单项来调用命令,CC 是Unix 工作站上使用的( C++编译器的命令名可以通过参考手册或系统管理员获得系统的C++命令名)。编译器的一部分工作是分析程序代码的正确性,编译器不能判断程序的语义是否正确,但能够判断出程序形式上的错误,下面是程序员很容易犯的两个错误。

    例如:
int main ( { // 错误缺少
readIn(): // 错误非法字符
sort();
compact();
print();
return 0 // 错误缺少 ';'
}

 


2 类型错误在C++中每个数据项都有一个相对应的数据类型,例如10 是一个整型数值由双引号括起来的词,hello 是一个字符串,如果为一个需要整型参数的函数提供了一个字符串,编译器就会报告类型错误,错误消息包含一个行号以及编译器对错误的简要描述,按报告的顺序逐一修正错误是个好的习惯。一个简单的错误常常有很多关联影响,会使编译器报告的错误比实际要多得多。因此一旦错误被改正后,应当马上重新编译,这个循环过程通常被称为编辑一编译一调试(dit compile debug)

 

第二 部分工作是转换正确的程序代码,这种转换被称为代码生成,典型情况下它生成目标代码或汇编指令代码,这些代码能够被运行该程序的计算机所理解,成功编译的结果是一个可执行文件。前面的程序执行时其输出结果如下

 

readln()
sort()
compact()
print()

 


C++定义了一组内置的基本数据类型,整数类型int、 浮点数类型float、 字符类型char 以及只有false 和true 两个值的布尔类型boolean。 每种类型都与C++语言中某一个关键字keyword 相关联,程序中的每个对象都与一个特定的类型相关联。

 

例如下面的代码

 


int age = 10;
double price = 19.99;
char delimiter = ' ';
bool found = false;

 


定义了四个对象age、 price 、delimiter 和found ,分别是整数类型、双精度浮点数类型、字符类型和布尔类型,每个类型都赋予了一个文字常量初始值。在内置类型之间经常发生隐式的类型转换, 例如将一个double 双精度型的常量赋给一个int 型的age,

age = 33.333;

 


实际上赋给age 的是被截断后的整数值33 [标准转换standard conversion 以及一
般类型的转换将在4.14 节中详细讨论]


C++标准库还提供了一组扩展的基本数据类型,其中包括字符串(string)、复数(complexnumber)、 向量(vector) 和列表(list), 例如


// 为了使用string 对象下面的头文件是必需的
#include <string>
string current_chapter = "Getting Started";
// 为了使用vector 对象下面的头文件是必需的
#include <vector>
vector<string> chapter_titles( 20);

 


current_chapter 是一个字符串对象,被初始化为字符串文字Getting Started,chapter_title是一个向量包含有20 个字符串类型的元素,以下这种特殊语法

 

vector <string>

 


指示编译器创建一个能够存放字符串元素的向量类型,要定义一个能够存放20 个整数的向量对象,我们可以这样写
vector<int> ivec(20);


本书对向量还将进行更多的描述。

无论是一种语言还是它的标准库,都不可能提供实际程序设计环境要求的所有数据类型,因此现代语言都提供了类型定义工具设施,使我们能够在语言中引入新的类型,这些类型的用法与内置类型的用法一样方便。在C++中这种设施就是类机制。在C++中像string、complex vector、 list 这样的标准库类型都被设计成类。实际上输入输出库也是这样的。类设施可能是C++中最重要的组成部分,第2 章对整个类机制作了基本的概述性介绍

 

 

 

1.2.1 程序流程控制

 


缺省情况下语句将按顺序执行,例如在前面的程序中重新列在下面read()总是先被执行,然后是sort()、compact()、write()。


int main()
{
read();
sort();
compact();
write();
return 0;
}

 


然而,如果销售进展得很慢,例如只有0 或1 项那么就没有必要排序和压缩了,但是我们仍然需要输出这一项销售记录或者指出没有销售记录产生。通过条件语句if 我们可以完成这项工作,假设已经重写了readln()函数使其能够返回读入的项数


// read()返回读入的项数
// 返回值的类型为int
int read() { ... }
// ...
int main()
{
int count = read();
// 如果读入的项数大于1
// 就调用sort()和compact()
if ( count > 1 ) {
sort();
compact();
}
if ( count == 0 )
cout << "no sales for this month/n";
else write();
return 0;
}

 


第一个if 语句给出了在括号中的条件表达式为真的情况下应该执行的动作,在这个被修改过的程序中,只有在count 大于1 的时候sort() 、compact()函数才会被调用。在第一个if语句中为两个执行分支,如果条件为真,在这里即如果count 等于0 则简单地输出没有销售产量,否则只要count 不等于0, 就调用write() 。我们将在5. 3 节中详细讨论if 语句。


第二种非顺序执行的语句是迭代(iterate )或称循环(loop) 语句,当条件保持为真的时候,循环重复执行一条或多条语句,例如

 


int main()
{
int iterations = 0;
bool continue_loop = true;
while ( continue_loop != false )
{
iterations++;
cout << "the while loop has executed "
<< iterations << " times/n";
if ( iterations == 5 )
continue_loop = false;
}
return 0;
}

 


在这个看似人为构造的例子中,while 循环执行5 次,再到iterations 等于5 并且continue_loop 被赋值为false, 如下语句
iterations++;

将使iterations 加1 在1.5 节中将有更实际的while 循环的例子第15 章将详细讲解循
环语句

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值