开始
本文介绍C++语言的基本元素;包括内置数据类型、对象的定义、表达式、语句、函数的定义和使用。本文将给出一个最小的合法C++程序,主要用它来讨论程序的编译过程、预处理,并将首次介绍C++对输入输出的支持。
1、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)语句,他把book_on_shelf 和 book_on_order 的值相加,并把结果放入与book_count相关联的计算机内存区域内。这里假定book_on_shelf 和 book_on_order已经在前面的代码中声明为整型,并赋了初值。
第三条是输出(output)语句,cout是与用户终端相关联的输出目标。<< 是输出操作符,该语句向 cout(即用户终端)先输出用引号括起来的字符串文字,然后输出存储在与名字book_count相关联的内存区域中的值。假设此时book_cout中的值为11273,那么输出结果为:
the value of book_count: 11273
把语句按逻辑语义分组,就形成了一些有名字的单元,这些单元被称为函数(function)。例如:把所有需要读取销售文件的语句组织到一个被称为readIn()的函数中。类似的,我们可以构成sort()、compact() 和 print()函数。
在C++中,每个程序必须包含一个被称为 main() 的函数,它是由程序员提供的,并且只有这样的程序才能运行。下面是按前述算法定义的一种 main()函数:
int main()
{
readIn();
sort();
compact();
print();
return 0;
}
C++程序从 main() 函数的第一条语句开始执行,在本例中,程序从函数readIn()开始。并且程序按顺序执行 main() 函数中的语句。在执行完 main() 函数的最后一条语句之后,程序正常结束。
函数由四部分组成:返回类型、函数名、参数列表以及函数体。前三部分合起来称为函数原型(function prototype)。
参数列表由小括号括起来,包含一个或多个由逗号分开的参数。函数体由一对花括号括起来,由程序语句序列构成。
在本例中,main()函数的函数体调用函数 readIn()、sort()、compact()和print(),当这些函数都调用完成时,语句 return 0;将被执行。return 是C++预定义语句,它提供了终止函数执行的一种方法。当 return 语句提供了一个值时,例如0,这个值就成为函数的返回值(return value)。本例中,返回值为0表示main()函数成功执行完毕。(标准C++中,如果main()函数没有显式地提供返回语句,则它缺省返回0。)
现在我们来看一下,如果想让我们的程序能够执行起来,我们还需要做那些准备工作。首先,必须提供readIn()、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()函数调用时只会简单地在用户终端上显示他的存在,以后会用真正地实现函数来代替这些哑函数。
程序源文件地名字,一般包括两部分:文件名以及文件后缀。文件后缀一般用来标识文件内容。
以下为一个完整地函数:
#include <iostream>
using namespace std;
void readIn(){ cout<<"readIn()\n"};
void sort() { cout<<"sort()\n" };
void compact(){ cout<<"compact()\n"};
void print() { cout<<"print()\n" };
int main()
{
readIn();
sort();
compact();
print();
return 0;
}
iostream是输入/输出流标准文件(注意没有后缀),它包含cout的信息,这对程序是必须的。#include是预处理器提示符(preprocessor directive),他把iostream的内容读入我们的文本文件中。
编译器的一部份工作是分析程序代码的正确性。编译器不能判断程序的语义是否正确,但是能够判断出程序形式上的错误,下面该是两个常见的程序形式错误:
- 语法错误。程序员犯了C++语言的语法错误。例如:
int main({ //错误: 缺少)
readIn(): //错误: 非法字符
sort();
compact();
ptint();
return 0 //错误:缺少“;”
}
- 类型错误。在C++中每个数据项都有一个相对应的数据类型。例如,10是一个整数数值。由双引号括起来的“hello”是一个字符串。如果为一个需要整型参数的函数提供了一个字符串,编译器就会报告类型错误。
错误消息包含一个行号以及编译器对错误的简要描述。按报告的顺序逐一修正错误,是个好的习惯。一个简单的错误常常有很多关联影响,会使编译器报告的错误比实际要多得多,因此,一.旦错误被改正后,应当马上重新编译。这个循环过程通常被称为编辑一 编译一 调试(edit一compile一debug)。
编译器的第二部分:工作是转换正确的程序代码。这种转换被称为代码生成(codegeneration)。 典型情况下,它生成目标代码或汇编指令代码。这些代码能够被运行该程序的计算机所理解。
成功编译的结果是一一个可执行文件。前面的程序执行时,其输出结果如下:
readIn()
sort()
compact()
ptint()
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,分别是整数类型、双精度浮点数类型、字符类型和布尔类型。每个类型都赋予了一个初值:整数10,浮点数19.99,空格字符,布尔值false。