1、 1 / 1711.1 C+程序结构 (Structure of a program)下面我们从一个最简单的程序入手看一个 C+程序的组成结构。/ my first program in C+#include using namespace std;int main() cout 以#标志开始的句子是预处理器的指示语句。它们不是可执行代码,只是对编译器作出指示。在本例中这个句子# include 告诉编译器的预处理器将输入输出流的标准头文件(iostream.h)包括在本程序中。这个头文件包括了 C+中定义的基本标准输入-输出程序库的声明。此处它被包括进来是因为在本程序的后面部分中将用到它的功
2、能。using namespace std;C+标准函数库的所有元素都被声明在一个名空间中,这就是 std名空间。因此为了能够访问它的功能,我们用这条语句来表达我们将使用标准名空间中定义的元素。这条语句在使用标准函数库的 C+程序中频繁出现,本教程中大部分代码例子中也将用到它。int main()2 / 171这一行为主函数(main function)的起始声明。main function 是所有 C+程序的运行的起始点。 不管它是在代码的开头,结尾还是中间 此函数中的代码总是在程序开始运行时第一个被执行。并且,由于同样的原因,所有 C+程序都必须有一个 main function。main
3、 后面跟了一对圆括号(),表示它是一个函数。C+中所有函数都跟有一对圆括号 (),括号中可以有一些输入参数。如例题中显示,主函数(main function)的内容紧跟在它的声明之后,由花括号 ()括起来。 cout int main ()Hello World! Im a C+ program 3 / 171cout int main ()cout using namespace std;int main ()/ declaring variables:int a, b;int result;/ process:a = 5;b = 2;a = a + 1;result = a - b;/ p
4、rint out the result:cout using namespace std;int main ()int a=5; / 初始值为 5612 / 171int b(2); / 初始值为 2int result; / 不确定初始值a = a + 3;result = a - b;cout ,并且使用 using namespace语句来使用标准名空间(std),如下面例子所示:/ C+字符串例题#include #include using namespace std;int main ()string mystring = “This is a string“;cout #incl
5、ude using namespace std;int main ()string mystring;mystring = “This is the initial string content“;cout using namespace std;int main ()int a, b; / a:?, b:?a = 10; / a:10, b:?b = 4; / a:10, b:4a = b; / a:4, b:4b = 7; / a:4, b:7cout =, using namespace std;int main ()5 22 / 171int a, b=3;a = b;a+=2; /
6、相当于 a=a+2cout , =, 大于 Greater than= 大于等于 Greater or equal than4) 将返回 true.(3 != 2) 将返回 true.(6 = 6) 将返回 true.(5 = c) 将返回 true 因为它实际是(2*3 = 6)(b+4 a*c) 将返回 false因为它实际是(3+4 2*6)24 / 171(b=2) = a) 将返回 true.注意:运算符= (单个等号)不同于运算符= (双等号)。第一个是赋值运算符(将等号右边的表达式值赋给左边的变量);第二个(=)是一个判断等于的关系运算符,用来判断运算符两边的表达式是否相等。因此
7、在上面例子中最后一个表达式(b=2) = a),我们首先将数值 2赋给变量 b,然后把它和变量 a进行比较。因为变量 a中存储的也是数值2,所以整个运算的结果为 true。 在 ANSI-C+标准出现之前的许多编译器中,就像 C语言中,关系运算并不返回值为真 true或假 false的 bool值,而是返回一个整型数值最为结果,它的数值可以为 0,代表“false“或一个非 0数值(通常为 1)来代表“true“。 逻辑运算符 Logic operators ( !, int main ()int a,b,c;a=2;b=7;c = (ab) ? a : b;cout b)运算值为假(fals
8、e),所以整个表达式(ab)?a:b 要取分号后面的值,也就是 b的值 7。因此最后输出 c 的值为 7。26 / 171逗号运算符 ( , )逗号运算符 (,) 用来分开多个表达式,并只取最右边的表达式的值返回。例如有以下代码:a = (b=3, b+2); 这行代码首先将 3赋值给变量 b,然后将 b+2 赋值给变量 a。所以最后变量 a 的值为5,而变量 b的值为 3。位运算符 Bitwise Operators ( float f = 3.14;i = (int) f; 以上代码将浮点型数字 3.14转换成一个整数值(3)。这里类型转换操作符为(int)。在C+中实现这一操作的另一种方
9、法是使用构造函数 constructor 的形式:在要转换的表达式前加变量类型并将表达式括在括号中:27 / 171i = int ( f );以上两种类型转换的方法在 C+中都是合法的。另外 ANSI-C+针对面向对象编程(object oriented programming)增加了新的类型转换操作符 (参考 Section 5.4, Advanced class type-casting).sizeof()这个运算符接受一个输入参数,该参数可以是一个变量类型或一个变量自己,返回该变量类型(variable type) 或对象(object)所占的字节数: a = sizeof (char
10、); 这将会返回 1给 a,因为 char是一个常为 1个字节的变量类型。sizeof返回的值是一个常数,因此它总是在程序执行前就被固定了。 其它运算符在本教程后面的章节里我们将看到更多的运算符,比如指向指针的运算或面向对象编程特有的运算,等等,我们会在它们各自的章节里进行详细讨论。运算符的优先度 Precedence of operators当多个操作数组成复杂的表达式时,我们可能会疑惑哪个运算先被计算,哪个后被计算。例如以下表达式: a = 5 + 7 % 2 我们可以怀疑它实际上表示:a = 5 + (7 % 2) 结果为 6,还是 a = (5 + 7) % 2 结果为 0?正确答案为
11、第一个,结果为 6。每一个运算符有一个固定的优先级,不仅对数学运算符(我们可能在学习数学的时候已经很了解它们的优先顺序了),所有在 C+中出现的运算符都有优先级。从最从最高级到最低级,运算的优先级按下表排列:优先级 操作符 说明 结合方向28 / 171Level Operator Description Grouping1 : 范围 从左到右2 () . - + - dynamic_cast static_cast reinterpret_cast const_cast typeid 后缀 从左到右+ - ! sizeof new delete 一元(前缀)* 根据我们想要实现的计算的不同,
12、可以写成:a = 5 + (7 % 2); 或者 a = (5 + 7) % 2; 29 / 171所以如果你想写一个复杂的表达式而不敢肯定各个运算的执行顺序,那么就加上括号。这样还可以使代码更易读懂。1.5 控制台交互(Communication through console)控制台(console)是电脑的最基本交互接口,通常包括键盘(keyboard)和屏幕(screen)。键盘通常为标准输入设备,而 屏幕为标准输出设备。在 C+的 iostream函数库中,一个程序的标准输入输出操作依靠两种数据流:cin 给输入使用和 cout给输出使用。另外,cerr 和 clog也已经被实现它们
13、是两种特殊设计的数据流专门用来显示出错信息。它们可以被重新定向到标准输出设备或到一个日志文件(log file)。因此 cout (标准输出流)通常被定向到屏幕,而 cin (标准输入流)通常被定向到键盘。通过控制这两种数据流,你可以在程序中与用户交互,因为你可以在屏幕上显示输出并从键盘接收用户的输入。输出 Output (cout)输出流 cout与重载(overloaded)运算符一起使用:cout “Output sentence“; / 打印 Output sentence到屏幕上cout 120; / 打印数字 120 到屏幕上cout x; / 打印变量 x 的值到屏幕上 运算符又
14、叫插入运算符(insertion operator) 因为它将后面所跟的数据插入到它前面的数据流中。在以上的例子中,字符串常量 Output sentence,数字常量 120和变量x先后被插入输出流 cout中。注意第一句中字符串常量是被双引号引起来的。每当我们使用字符串常量的时候,必须用引号把字符串引起来,以便将它和变量名明显的区分开来。例如,下面两个语句是不同的:cout “Hello“; / 打印字符串 Hello到屏幕上cout Hello; / 把变量 Hello存储的内容打印到屏幕上 30 / 171插入运算符 insertion operator ()可以在同一语句中被多次使用
15、:cout “Hello, “ “I am “ “a C+ sentence“; 上面这一行语句将会打印 Hello, I am a C+ sentence 到屏幕上。插入运算符() 的重复使用在我们想要打印变量和内容的组合内容或多个变量时有所体现:cout “Hello, I am “ age “ years old and my zipcode is “ zipcode; 如果我们假设变量 age的值为 24,变量 zipcode的值为 90064,以上句子的输出将为: Hello, I am 24 years old and my zipcode is 90064 必须注意,除非我们明确
16、指定,cout 并不会自动在其输出内容的末尾加换行符,因此下面的语句:cout “This is a sentence.“;cout “This is another sentence.“; 将会有如下内容输出到屏幕:This is a sentence.This is another sentence.虽然我们分别调用了两次 cout,两个句子还是被输出在同一行。所以,为了在输出中换行,我们必须插入一个换行符来明确表达这一要求。在 C+中换行符可以写作n:cout “First sentence.n “;cout “Second sentence.nThird sentence.“; 将会产生如下输出: First sentence.Second sentence.Third sentence. 另外,你也可以用操作符 endl来换行,例如:cout “First sentence.“ endl;cout “Second sentence.“ endl; 将会输出:First sentence.Second sentence.