[3]第二章 C++编程简介

时间:2023-03-09 17:34:38
[3]第二章 C++编程简介

(本资料均从 internet 上进行收录整理,若要转载,请与原作者联系)

2.1  机器语言、汇编语言和高级语言

程序员用各种编程语言编写指令,有些是计算机直接理解的,有些则需要中间翻译(tranlation)的步骤。如今使用的计算机语言有几百种,可以分为三大类:

1.机器语言

2.汇编语言

3.高级语言

任何计算机只能直接理解本身酌机器语言(machine language)。机器语言是特定计算机的自然语言,由计算机的硬件设计定义。机器语言通常由一系列数字组成(最终简化0和1),让计算机一次一个地执行最基本的操作。机器语言非常繁琐,下面的机器语言程序将工龄工资和基础工资相加,并把结果保存在工资总额中:

+1300042774

+1400593419

+1200274027

随着计算机越来越普及,机器语言编程对大多数程序员显然太慢、太繁琐。程序员不用计算机直接理解的一系列数字,而是用类似英文缩写的助记将来表示计算机的基本操作,这些助记符构成了汇编语言(assembly language)。称为汇编器(assembler)的翻译程序以计算机的速度将汇编语言程序转换为机器语言。下列汇编程序也是工龄工资和基础工资相加,并将结果保存在总工资中,但要比相应的机器语言清晰得多:

LOAD    BASEPAY

ADD     OVERPAY

STORE   GROSSPAY

尽管这种代码对于人们一目了然,但计算机却无法理解,必须先翻译为相应的机器语言。

随着汇编语言的出现,计算机的使用迅速增加,然而即使是最简单的任务.也需要许多条指令才能完成。为了加速编程过程,人们开发了高级语言(high-level language),用一条语句完成大量任务。称为编译器(compiler)的翻译程序将高级语言程序变为相应的机器语言。高级语言使程序员能够编写更像英语的指令,可以包含常用的数学符号。将工龄工资和基础工资相加.并把结果保存在总工资中,可以用下列高级语言程序:

grossPay  = basePay + overTimePay

显然,从程序员角度看,高级语言比机器语言和汇编语言都要强得多。 C和C++是最强大最广泛使用的高级语言。

将高级语言程序编译为相应的机器语言的过程可能需要大量时间。解释器(interpreter)程序可以直接执行高级语言程序,而不必先将这些程序编译成相应的机器语言。尽管编译程序的执行速度比解释程序更快,但解释器在程序开发环境中更常用,因为增加新特性和纠正错误时经常需要重

新编译程序。一旦程序开发完成,编译版本的运行最有效。

2.2  C语言与C++的历史

C++是从C语言演变而来的,而C语言又是从两个编程语言BCPL和B演变而来的、BCPL是Martin Richards于1967年开发的,用于编写操作系统软件和编译器。Ken Thompson在他的B语言(1970年在贝尔实验室)。DCPL和B都是“无类型”语言,每个数据项在内存中占一个“字”(word)长、如果要将数据项作为整数或实数处理,编程的工作量会很大。

C语言是从D语言演变而成的,由贝尔实验室的Dennis Ritchie开发,最初于1972年在DEC PDP—11计算机上实现。C语言使用了BCPL和B的许多重要概念,同时增加了数据类型和其他特性。C语言最初作为UNIX操作系统的开发语言而闻名于世。如今,大多数操作系统都是用C/C++写成的。二十多年来,C语言已经遍布在大多数计算机上。C语言是硬件无关的,只要仔细设计。就可以编写能移植列大多数计算机上的C语言程序。

到20世纪70年代未期,C语言演变成现在所谓的“传统C”、“经典CPP或“Kernighan/RitchieC"。1978年Prentice Hall公司出版了Kernighan和Ritchie合作的著作《The CProgrmmming Language》,引起了人们对C语言的广泛关注(见参考文献Ke78)。

C语言在各种不同类型计算机(有时称为硬件平台)上的普及导致了许多变形。它们虽然相似,但通常互不兼容。对需要为不同平台编写可移植程序的开发人员.这是个严重问题,显然需要有个标准的C语言版本。1983年,美国国家计算机与信息处理标准委员会(x3)成立了x3JII技术分会,目的是提供无歧义性且与机器无关的语言定义。1989年推出了这种语言标准。AN5I与国际标准化组织(IS0)合作.在全球范围内将C语言标淮化,1990年推出了联合标准文档。称为ANSI/IS09899:1990。这个文档可以从ANSI获得副本。1988年推出的Kernighan 和Ritchie著作的第二版体现了该版本(称为ANSI C),这也是目前全世界使用的版本。

C++是C语言的扩展,是20世纪80年代初由贝尔实验室的Bjarne stroustrup开发的。C++的许多特性是从c语言中派生的,但更重要的是,它提供了面向对象编程(object-oriented programming)的功能。

软件业正在酝酿一场革命,最终日标是更快、更正确、更经济地建立软件,新的、更强大的软件需求迫在眉睫。对象(object)实际上是模拟实际项目的可复用软件组件(component)。软件开发人员发现,利用模块化、面t向对象的设计和实现方法与过去结构化编程方法相比较,可以使软件开发小组的生产率更高。面向对象编程的优势在于更容易理解、纠正和修改。

许多面向对象的语言也纷纷涌现,包括最著名的由Xerox的Palo Alto研究中心(PARC)开发的small talk。Smalltalk是纯粹的面向对象的语言,其所有的编程元素都是“对象”。C++则是一种“混合型语言“,可以用C语言方式、面向对象方式或兼用两种方式进行编程。2.9节将介绍基于C/C++的新语言——Java。

2.3  C++标准库

C++程序由类(class)和函数(function)组成。可以用多个小的软件模块构成C++程序,但大多数C++程序员会利用C++标准库中已有的类和函数来编程。这样,C++“世界”中实际要学习两方面的知识,第一是学习C++语言本身,第二是学习如何利用C++标准库中现有的类和函数(本教程将介绍许多类和函数)。 Plauger的著作是程序员必读的.可以帮助程序员深入了解C++中包括的ANSI C语言库函数,了解如何实现这些库函数,还可以了解如何用库函数编写可移植代码。标准库函数通常由编译器厂家提供。许多独立软件供应商(indepandent softerware vender)也提供各种专用类库。

常用数据类型与Pascal 数据类型的比较:

Pascal

数据类型

C/C++

ShorInt

8位有符号整数

char

Byte

8位无符号整数

BYTE,unsigned short

SmallInt

16位有符号整数

short

Word

16位无符号整数

unsigned short

Integer,LongInt

32位有符号整数

int,long

Cardinal,LongWord/DWORD

32位无符号整数

unsigned long

Int64

64位有符号整数

_int64

Single

4字节浮点数

float

*Real48

6字节浮点数

 

Double

8字节浮点数

double

*Extended

10字节浮点数

long double

Currency

64位货币类型

 

TDate/TDateTime

8字节日期/时间

 

Variant,OleVariant

16字节可变类型

VARIANT,^Variant,^OleVariant

Char,AnsiChar

1字节字符

char

WideChar

2字节字符

WCHAR

*ShortString

短字符串

string

AnsiString/String

长字符串

^AnsiString

WideString

宽字符串

^WideString

PChar,PAnsiChar

NULL结束的字符串

char*

PWideChar

NULL结束的宽字符串

LPCWSTR

Boolean,ByteBool

1字节布尔类型

任何1字节

WordBool

2字节布尔类型

任何2字节

BOOL,LongBool

4字节布尔类型

BOOL

注:有*前缀的是向前兼容类型;有^前缀的是C++Builder特有类型。

2.4  结构化编程

20世纪60年代,许多大型软件的开发遇到了严重困难。常常推迟软件计划,因而使成本大大超过预算,而且最终产品也不可靠。人们开始认识到,软件开发是项复杂的活动,比原来所预想的要复杂得多。20世纪60年代的研究结果是结构化编程(structured programming)的出现,用规定的方法编写程序比非结构化编程能产生更清晰、更容易测试/调试以及更容易修改的程序。本教程的第2章将介绍结构化编程原理。第3章到第5章则会开发多种结构化程序。

结构化编程研究的一个更具体结果是1971年Niklaus Wirth教授推出了Pascal语言。Pascal语言是用17世纪著名数学家和哲学家巴雷斯·帕斯卡(Blaise Pascal)的名字命名的,常用于教学中讲解结构化编程.因而很快成为了大学中受欢迎的语言。但是这个语言缺乏在商业、工业和*应用程序中所需要的许多特性,因此没有被大学以外的环境所接受。

Ada语言是在20世纪70年代和80年代初由美国国防部资助开发的。在此之前,国防部的导弹命令与控制软件系统是由几百种不同语言生成的,国防部要求用一种语言来完成大多数工作。Ada以Pascal为基础.但最终结构与Pascal大相径庭。这个语言是根据著名诗人Lord Byron的女儿(Ada Lovelace)的名字命名的。Ada Lovelace在19世纪初编写了世界上第一个计算机程序,用于charles Babbage设计的分析机引擎的计算设备。Ada的一个最重要功能是多任务(multiasking).程序员可以使多个活动任务并行发生。我们要介绍的其他常用高级语言(包括C/C++)通常只让程序员编写一次只有一个活动任务的程序。

2.5  简单程序

C++使用非程序员可能感到奇怪的符号。我们首先介绍一个简单程序:打印一行文本。程序及其屏输出如图2.2。

这段程序演示了C++语言的几个重要特性。我们详细介绍程序的每一行。

// Fig.2.2:fig1_02.cpp

// A first program in C++

以//开头,表示该选项其余部分是注释语句(comment)。程序员手稿注释语句用来说明和提高程序的可读性。注释语句还可以帮助其它人阅读和理解程序。在运行程序时注释语句并不使计算机采用任何操作。C++编译器忽略注释误句,不产生任何机器目标码。注释语句"first program in C++"只是描述该程序的用途。以//开头的说明语句称为单行貹注释语句(singned-line comment),因为该注释语句在行尾结束(注意:C++程序员也可以用C语言注释语句样式,即注释语句以/*开头,以*/结束)。

1  // Fig. 2.2:fig01_02.cpp

2 // A first program in C++

3 #include <iostream>

4 using namespace std;

5 int main()

6 {

7     cout<<"Welcom to C++!\n";

8

9     rerturn 0;    // indicate that program ended sucessfully

10 }

输出结果:

Welcom to C++!

下列语句:

#include <iostream>

是条预处理指令(preprocessor directive),是发给C++预处理器的消息。预处理器先处理以#开头的一行语句之后再编译该程序。为一行预处理指令告诉预处理器要在程序中包括输入、输出的头文件iostream.h的内容。应该在任何使用C++式输入、输出泫从键盘输入数据或向屏幕输出数据的程序中包括这个头文件。注意,最新ANSI、ISO C++杂标准实际上指定iostream.h和其它标准头文件不需要后缀.h,如iostream。我们在本教程中有时继续使用旧式头文件,因为有些编译器还不支持最新的ANSI/ISO C++草案标准。

下列语句:

int main()

是每个C++程序都包的语句。main后面的括号表示main是个程序基本组件, 称为函数(function)。C++程序包含一个或几个函数,其中有且只有一个main函数即使main不是程序中的第一个函数,C++程序通常都从main函数开始执行。main左边的关键字int表示main返回一个整数值。

左花括号({)应放在每个函数体(body)开头,对应右花括号(})应放在每个函数的结尾。下列语句:

cout<<"Welcom to C++!\n";

让计算机在屏幕上打印引号之间的字符串(string)。 整个行称为语句(statement),包括cout<<运算符、字衔串"Welcom to C++!\n"和分号(;)。每条语句应以分号(又称为语句终止符)结束。C++中的输出和输入是用字符流(stream)完成的,这样,执行上述语句时,将字符流"Welcom to C++!"发送到标准输出流对象(standard output stream object)cout,通常cout将其输出到屏幕。第3章“C++输入/输出流”中将详细介绍cout。

运算符<<称为流插入符(strem insertion operator)。执行这个程序时,运算符右边的值(历操作数)插入输出流中。历操作数通常按引号中的原样直接打印。但注意字符\n不在屏幕中打印。反斜杠(\)称为转义符(escap character),表示要输出特殊字符。字符串中遇到反斜杠时,下一个字符与反斜杠组合,形成转义序列(escape sequence)。转义序列\n表示换行符(newline)。使光标(即当前屏幕位置的指示符)移到下一行开头。表2.3列出了常用转义序列。

下列语句:

return 0;        // indicate that program ended sucessfully

放在每个main函数的末尾。C++的关键字return 是退出函数的几种方式之一。main函数末尾使用return语句时,数值0表示顺利结束。第3章将详细介绍和解释包括这个语句的原因。目前只要记住在每个程序中都要包括这个语句。否则在某些程序中编译器会产生警告消息。

右花括号(})表示main函数结束。

------------------------------------------------------------------------------

转义序列                    说明

------------------------------------------------------------------------------

\n                   换行符,使屏幕光标移到屏幕中下一行开头

\t                   水平制表符,使屏幕光标移到下一制表位

\r                   回车符,使屏幕光标移到当前行开头,不移到下一行

\a                   警告,发出系统警告声音

\\                   反斜杠,打印反斜杠符

\"                   双引号,打印双引号

-------------------------------------------------------------------------------

图2.3 常用转义序列

许多程序员让函数打印的最后一个字符为换行符(\n)。这样可以保证函数使屏幕光标移到屏幕中下一行开头,这种习惯能促进软件复用,这是软件开发环境中的关键目标。

确定一个喜欢的缩排长度,然后一直坚持这个缩排长度。可以用制表符生成缩排,但制表位可能改变。建议用1/4英寸制表位或三个空格的缩排长度。

"Welcom to C++!"可用多种方法打印。例如,图2.4的程序用多条流插入语句,产生的程序输出与图2.2相同,因为每条流插人语句在上一条语句停止的位置开始打印。第一个流插入语句打印“Welcome”和空格,第二条流插入语句打印同一行空格后面的内容。C++允许以多种方式表达语句。

一条语句也可以用换行符打印多行,如图2.5。每次在输出流中遇到\n转义序列时,屏幕光标移到下一行开头。要在输出中得到空行,只要将两个\n放在一起即可,如图2.5。

1 // Fig. 2.4:fig01_04.cpp

2 // printing a line with multple statements

3 #include <iostream >

4 using namespace std;

5 int main()

6 {

7     cout<<"Welcom ";

8     cout<<"to C++!\n";

9

10     return 0;

11 }

输出结果:

Welcom to C++!

图2.4 用多条流插入语句打印一行

1 // Fig. 2.5:fig01_05.cpp

2 // printing multiple lines with a single statement

3 #include <iostream >

4 using namespace std;

5 int main()

6 {

7     cout<<"Welcom\nto\n\nC++!\n";

8

9     return 0;        // indicate that program ended sucessfully

10 }

输出结果:

Welcome

to

C++!

图2.5 用一条流插入语句打印多行

2.6  简单程序:两个整数相加

下一个程序用输入流对象cin和流读取运算符>>取得用户从键盘中输入的两个整 ,计算这两个值的和,并将结果用cout输出。程序及其输出如图2.6。

1 // Fig.2.6:fig01_06.cpp

2 // Addition program

3 #include <iostream >

4 using namespace std;

5 int main()

6 {

7     int integer1,integer2,sum;        // 声明三个变量

8

9     cout<<"Enter first integer\n";    // 提示信息

10     cin>>integer1;                    // 从键盘读一个整数

11     cout<<"Enter second integer\n";   // 提示信息

12     cin>>integer2;                    // 从键盘读一个整数

13     sum=integer1+integer2;            // 两整数相加,值赋给变量sum

14     cout<<"Sum is "<<sum<<endl;       // 输出和

15

16     return 0;        // 返回0值表示程序运行成功。

17 }

输出结果:

Enter first integer

45

Enter second integer

72

Sum is 117

图2.6 两个整数相加

注释语句:

// Fig. 2.6: fig01_06.cpp

// Addition program

指定文件名和用途。C++预处理指令:

#include <iostream >

将iostream.h头文件的内容放进程序中。

前面介绍过,每个程序从main函数开始执行。左花括号表示main函数体开头,相应右花括号表示main函数体结束。下列语句:

int integer1,integer2,sum;

是个声明(declaration)。integer1,integer2和sum是变量(variable)名。变量是计算机内存中的地址,存放程序使用的值。这个声明指定变量integer1,integer2和sum的数据类型为int,表示这些变量保存整数值,如7、-11、0、31914。所有变量都应先声明名称和数据类型后才能在程序中使用。几个相同类型的变量可以在同一声明或多个声明中声明。我们可以一次只声明一个变量,但一次声明多个同类型变量更加简练。

稍后要介绍数据类型float,(定义实数,即带小数点的数,如3.4、0.0、—11.19)和char(定义字符型数据.变量char只能保存一个小写字母、一个大写字母、一个数字或一个特殊字符,如x、$、7、*等等)。

变量声明可以放在函数的任何位置,但变量声明必须放在程序使用变量之前。如果不用一条语句声明三个变量也可以分别声明。下列声明:

int integer1;

可以放在下列语句之前:

cin >> integerl;

下列声明:

int  integer2;

可以放在下列语句之前:

cin >> integer2;

下列声明:

int sum;

可以放在下列语句之前:

sum = integer1 + integer2;

下列句:

cout<<"Enter first integer\n";

在屏幕上打印字符串Enter first integer(b也称为字符串直接量(string literal)或直接量(literal)),将光标移到下一行开头。这个消息称为提示(prompt),提示用户进行特定操作。上述语句表示cout得到字符串“Enter first integer\n".

下列语句:

cin>>integer1;

用输入流对象cin和流读取运算符>>取得键盘中的值。利用流读取运算符cin从标准输入流读取输入(通常是键盘输入)。上述语句表示cin提供integer1的值。

计算机执行上述语句时,等待用户输入变量integer1的值。用户输入整数值并按Enter键(或Return键),将数值发送给计算机。然后计算机将这个数(值)赋给变量integer1。程序中后面引用integer1时都使用这个值。

cout和cin流对象实现用户与计算机之间的交互。由于这个交互像对话一样,因此通常称为对话式计算(conversational computing)或交互式计算(interactive computing)。

下列语句:

cout<<"Enter second integer\n";

在屏幕上打印”Enter second integer"字样,然后移到下一行的开头。这个语句提示用户进行操作。下列语句:

cin>>integer2;

从用户取得变量integer2的值。

赋值语句:

sum=integer1+integer2;

计算变量integer1和integer2的和,然后用赋值运算符(assignment operator)"="将结果赋给变量sum。这个语句表示sum取得integer1加integer2的值。大多数计算都是在赋值语句中进行的。“=”运算符和前面的“+”运算符称为二元运算符,两个操作数是integer1和integer2。而对于“=”运算符,两个操作数是sum和表达式integer1+integer2的值。

下列语句:

cout<<"Sum is"<<sum<<endl;

打印字符串"Sum is"和变量sum的数值,加上称为流操纵算子的endl(end line的缩写)。endl输出 一个换行符,然后刷新输出缓冲区,即在一些系统中,输出暂时在机器中缓存,等缓冲区满时再打印到屏幕上,endl强制立即输出到屏幕上。

注意,上述语句输出多种不同类的值,流插入运算符知道如何输出每个数据。在一个语句中使用多个流插入运算符称为连接(concatenating)、链接(chaining)或连续使用流插入操作。这样,就不必用多条输出语句输出多个数据。

计算可以在输出语句中进行。可以将上述语句合二为一:

cout<<"Sum is"<<integer1+integer2<<endl;

从而不需要变量sum。

右花括号告诉计算机到达了函数main的结尾。

C++的一个强大我就是用户可以生成自己的数据类型(详见第6章),然后可以告诉C++如何用>>和<<运算符输入或输出这种类型的值(称为运算符重载,见第8章)。

2.7  算术运算

算术运算符见图2.10,注意这里使用了许多代数中没有使用的符号。星号(*)表示乘法、百分号(%)表示求模(modulus)。图2.10所示的算术运算符都是二元运算符,即这些运算符取两个操作数。例如,表达式"integer1+integer2"包含二元运算符“+”和两个操作数integer1和integer2。

C++操作            算术运算符        代数表达式            C++表达式

加                    +                f+7                    f+7

减                    -                p-c                    p-c

乘                    *                bm                     b*m

除                    /                x/y或x÷y              x/y

求模                  %                r mod s                r%s

图2.10 算术运算符

整除(即除数和被除数均为整数)取得整数结果。例如,表达式7/4得1,表达式17/5得3。注意,整除结果忽略分数部分,不用取整。

C++提供求模(modulus)运算符“%”即求得整除的余数。求模运算是个整数运算符,只能使用整数操作数。表达式x%y取得x除以y的余数,这样,7%4得3,17%5得2。后面几章将介绍求模运算符许多有趣的应用。如确定一个数是否为另一个数的倍数(确定一个数为奇数或偶数是这个问题的一个特例)。

C++中的算术运算表达式应以直线形式在计算机中输入。这样,a除以b应输入为"a/b",使所有常量、变量和运算符放在一行中。编译器通常不接受下列代数符号:

a

b

但有些特殊专业软件包支持复杂数学表达式更自然的表示方法。

C++表达式中括号的使用和代数表达式中相同。例如,要将a乘以b+c的和,可以用:

a*(b+c)

C++中算术运算符的运算顺序是由运算符的优先级规则确定的,与代数中的相同:

1. 括号中的表达式先求值,程序员可以用括号指定运算顺序。括号具有最高优先级,对于嵌套括号,由内存向外层求值。

2. 乘法、除法、求模运算优先。如果表达式中有多个乘法、除法、求模运算,则从左向右求值。乘法、除法、求模的优先级相同。

3. 然后再进行加法和减法。如果表达式中有多个加法和减法,则从左向右求值。加法和减法的优先级相同。

运算符优先级保证C++按正确顺序采用运算符。从左向右求值指的是运算符的结合律(associativity),也有一些运算符结合律是从右向左。图2.11总结 了运算符优先级规则,引入其它C++运算符时,这个表可以扩充,详细的运算符优先级请参见附录。

运算符       运算            求值顺序

( )           括号     最先求值,如果有嵌套括号,则先求最内层表达式的值,如果

同一层有几对括号,则从左向右求值。

*、/、或%    乘、除、求模    其次求值。如果有多个,则从左向右求值。

+或-          加、减          最后求值。如要有多个,则从左向右求值。

图 2.11 算术运算符优先级

下面用几个表达式说明运算符优先级规则。每个例子都列出代数表达式和对应的C+表达式。

下例求五个值的算术平均值:

代数:

C++:     m = (a+b+c+d+e)/5;

括号是必须的,因为作法的优先级比加法高,要把整个和(a+b+c+d+e)除以5,如果不加括号,则a+b+c+d+e/5的取值为:

a+b+c+d+(e/5)

下例是直线的方程:

代数: y = mx+b

C++:  y = m*x+b;

不需要括号,乘法优先于加法,因此先乘后加。

下列包含模(%)、乘、除、加、减运算:

代数: z = pr%q+w/x-y

C++: z = p * r % q + w / x - y;

⑥   ①  ②  ④ ③  ⑤

语句下面的圆圈数字表示C++采用运算符的顺序。乘法、求模和除法首先从左向右求值(结合律为从左向右)因为它们的优先级高于加法和减法。然后进行加法和减法运算,也是从左向右求值。

并不是有多对括号的表达式都包含嵌套括号。例如下列表达式不包含嵌套括号:

a * (b+c)+c*(d+e)

这些括号在同一层。

要更好地了解运算符优先级规则,考虑二次多项式的求值:

y = a * x * x + b * x + c;

⑥  ①  ②  ④  ③  ⑤

语句下面的圆圈数字表示C++采用运算符的顺序。C++中没有指数运算符,因此我们把x2表示为x*x,稍后会介绍标准库函数pow(数)。由于pow所需要的数据类型有一些特殊情况,因此放第3章再介绍。

假设变量a、b、c、x初始化如下:a=2,b=3,c=7和x=5。图2.12演示了上述二次多项式的运算符优先级。

上述赋值语句可以加上多余的括号,使代码更清晰:

y=(a*x*x)+(b*x)+c;

2.8  判断:相等与关系运算符

本节介绍简单的C++ if结构,使程序根据某些条件的真假做出判断。如果条件符合,即为真(true),则执行if结构体的语句;如果不符合,即条件为假(false),则不执行语句,稍后将举例说明。

if结构中的条件可以用相等运算符(equality operator)和关系运算符(relational operator)表示,如图2.13 关系运算符具有相同的优先级,结合律为从左向右。相等运算符的优先级也相同,但低于关系运算符的优先级,结合律也为从左向右。

标准代数相等与关系运算符    C++相等与关系运算符    C++条件举例    C++条件含义

=                            ==                   x==y            x等于y

≠                           !=                   x!=y             x不等于y

关系运算符

>                            >                    x>y             x大于y

<                            <                    x<y             x小于y

≥                           >=                   x>=y          x大于或等于y

≤                           <=                   x<=y          x小于或等于y

图 2.13 相等与关系运算符

下例用六个if语句比较用户输入的两个数。如果其中任何一个if语句的条件成立,则执行与该if相关联的输出语句。图2.14显示了这个程序和三个示例输出。

注意图2.14的程序边疆使用流读取操作输入两个整数。首先将一个值读到num1中,然后将一个值读到num2中。if语句的缩排是为了提高程序的可读性。另外,注意图2.14中每个if语句体中有一条语句。第2章将会介绍结构体中有多条语句的if 语句(将语句体放在花括号“{ }”中)。

1 // Fig.2.14:fig01_14.cpp

2 // Using if statements,relationnal

3  // operators,and equality operators

4 #include <iosream>

5 using namespace std;

6 int main()

7 {

8      int num1,num2;

9

10     cout<<"Enter two integers,and I will tell you\n"

11     <<"the relationships they satisfy: ";

12     cin>>num1>>num2;        // 读取两个整数

13

14     if (num1= =num2)

15     cout<<num1<<" is equal to"<<num2<<endl;

16

17     if (num1!=num2)

18     cout<<num1<<" is not equal to "num2<<endl;

19

20     if (num1<num2)

21         cout<<num1<<" is less than "<<num2<<endl;

22

23     if (num1>num2)

24         cout<<num1<<" is greater than "<<num2<<endl;

25

26     if (num1<=num2)

27         cout<<num1<<" is less than or equal to "

28             <<num2<<endl;

29

30     if (num1>=num2)

31         cout<<num1<<" is greater than or equal to "

32             <<num2<<endl;

33

34     return 0;        // 返回一个程序正常结束的标识

35 }

输出结果:

Enter two integers,and I will tll you

The relationships they satisfy: 3 7

3 is not equal 7

3 is less than 7

3 is less than or equal to 7

Enter two integers,and I will tell you

the relationships they satisfy:22 12

22 is not equal 12

22 is gretaer than 12

22 is greater than or equal to 12

Enter two integers,and I will tell you

the relationships they satisfy:7 7

7 is equal to 7

7 is less than or equal to 7

7 is greater than or equal to 7

图2.14 使用相等和关系运算符

注意图2.14中空格的用法。在C++语言中,空白字符(如制表符、换行符和空格)通常都被编译器忽略。因此,语句中可以根据程序员的爱好加上换行符和空格,但不能用换行符和空格分隔标识符。

图2.15显示了本章介绍的运算符优先级,运算符优先顺序从上向下递减。注意赋值运算符之后的所有运算符结合律均为从左向右。加法是左结合的,因此表达式x+y+z求值为(x+y)+z。赋值运算符是从右向左结合的,因此表达式x=y=0求值为x=(y=0),首先将0赋给y,然后将结果0赋给x。

运算符                    结合律                       类型

( )                        从左向右                    括号

*    /    %                从左向右                    乘

+    -                     从左向右                    加

<<    >>                   从左向右                    流插入/读取

<    <=    >    >=         从左向右                    关系

==    !=                   从左向右                    等于

=                          从右向左                    赋值

图 2.15 运算符优先级和结合律

2.9  新型头文件与名字空间

本节是为使用支持ANSI/ISO草案标准的编译器用户提供的。草案标准指定了许多旧式C++头文件的新名,包括iostream.h,大多数新式头文件不再用扩展名.h。图2.16改写图2.2,演示新型头文件和两种使用标准库头文件的方法。

第3行:

#include <iostream>

演示新型头文件 名语法。

第5行:

using namespace std;

指定用std名字空间(namespace),这是C++中的新特性。名字空间可以帮助程序员开发新的软件组件而不会与现有软件组件产生命名冲突。开发类库的一个问题是类和函数名可能已经使用。名字空间能为每个新软件组件保持惟一的名称。

1 // Fig. 2.16:fig01_16.cpp

2 // Using new-style header files

3 #include <iostream.h>

4

5 using namespace std;

6

7 int main()

8 {

9     cout<<"Welcom to C++!\n";

10     std::cout<<"Welwcom to C++!\n";

11

12     return 0;

13 }

输出结果:

Welcom to C++!

Welcom to C++!

图 2.16 使用新型头文件

C++草案标准中的每个头文件用名字空间std保证今后C++标准库操作的每个特性是惟一的,不会与其它程序员开发的软件组件混淆起来,程序员不能用名字空间定义新的类库。上述语句只是表示我们使用C++标准库中的软件组件,要定义自己的类库,则可以将我们的所有类和函数放在名字空间deitel中,使我们的类库与所有其它公司的类库和C++标准类库区别开来。

程序中出现"using namespace std"语句之后,就可以像第9行那样用cout对象将数值输出到标准输出流中。如果使用两个或几个类库,其中有的特性名称相同,则可能引起名称冲突。这时就要用名字空间来完全限定所用的名称,例如第10行的std::cout:

std::cout<<"Welcom to C++!\n";

cout的完全限定名为std::cout,如果全部采用这种形式,虽然比较繁琐,但程序中第5行的"using namespace std"语句就没有必要了。using语句可以在C++标准库中使用每个名称的简写版本(或其它指定名字空间的名称)。我们将在本教程稍后详细介绍名字空间。目前并不是所有C++环境都已经支持新的头文件的命名格式。为此,我们在本教程大部分地方使用旧式头文件 ,只在介绍C++标准新特性时才使用新的头文件命名格式,使用新格式时将特别注明。