## 1.5 第一个程序
按照惯例,人们用新语言编写的第一个程序叫做“Hello World”。因为它所做的所有事情就是输出“Hello,World”。在C++中,这个程序是这样的:
~~~
#include <iostream.h>
// main: generate some simple output
void main ()
{
cout << "Hello, world." << endl;
return 0;
}
~~~
有些人根据“Hello World”程序的简洁程度评判编程语言的质量。按照这个标准, C++做得相当不错。即便如此,这个简单的程序里依然包含着很难对编程新手解释的某些语言特性。现在,我们会先忽略其中一部分,比如第一行。
第二行以“//”开头,代表__注释__。注释是指在程序中插入的用于解释程序行为的一些文字。当编译器看到“//”时,它会忽略从该位置开始到行尾的整行内容。
第三行,你暂时可以忽略`void`,但是请注意`main`。`main`是指示程序入口点的特殊命名。当一个程序开始执行时,它从main中的第一条语句按顺序执行直到末尾,然后退出。
`main`中的语句数目没有限制,但是该例子只包含一条。这是一条基本的输出语句,表示在屏幕上输出或者显示一条消息。
`cout` 是由系统提供的允许你把内容输出到屏幕的特殊对象。`<<`符号是一个操作符,表示将一个字符串应用于cout。这会使该字符串显示在屏幕上。
endl也是一个特殊符号,代表一行的结束。当发送`endl`给`cout`时,屏幕上的光标会移动到下一行。所以,当下一次输出时,新的内容会在下一行显示。
像所有语句一样,输出语句也是以分号结尾。
你还需要注意这个程序中的其他一些小符号。首先,C++使用花括号(“{”和“}”)对内容分组。在这种情况下,输出语句包含在花括号里,意味着它在main的定义内部。同时,注意语句的缩进,它可以直观地显示该定义的内部都有哪些行。
现在,你可以坐在电脑前自己编译并运行这个程序。具体实现的细节取决于你的编程环境,但是从现在开始,我假定你知道应该如何做。
如前所述,C++编译器对语法检查很严格。当你编写程序时出现任何错误,编译都很有可能不成功。比如,你拼写错了`iostream`,你可能会得到以下错误消息:
~~~
hello.cpp:1: oistream.h: No such file or directory
~~~
这一行包含大量隐蔽密集的信息,并不容易读懂。一个更友好的编译器可能会这样表述:
“hello.cpp源代码文件第一行,尝试引用头文件oistream.h。找不到该文件,只找到文件iostream.h。这是否可能是你需要的?”
遗憾的是,很少有编译器这么友好。编译器并不智能,大多数情况下你得到的错误消息只是一个关于错误的提示。学会解析编译器的消息需要花一些时间。
尽管如此,编译器依然是学习语言语法规则的有力工具。从一个可以正常运行的程序入手(比如`hello.cpp`),用不同的方法修改它并查看结果。如果你得到错误消息,记住错误消息的内容以及导致错误的原因,这样下次再看到的时候就能够知道它是什么意思。
- 译者简介
- 作者简介
- 第1章 编程方式
- 1.1 什么是编程语言
- 1.2 什么是程序
- 1.3 什么是调试
- 1.4 形式语言和自然语言
- 1.5 第一个程序
- 1.6 术语
- 第2章 变量和类型
- 2.1 输出更多
- 2.2 值
- 2.3 变量
- 2.4 赋值
- 2.5 输出变量
- 2.6 关键字
- 2.7 运算符
- 2.8 计算顺序
- 2.9 字符类型的运算符
- 2.10 组合
- 2.11 术语
- 第3章 函数
- 3.1 浮点数
- 3.2 从double转换为int
- 3.3 数学函数
- 3.4 复合表达式
- 3.5 添加新的函数
- 3.6 定义和用法
- 3.7 多函数程序
- 3.8 形参和实参
- 3.9 形参和局部变量
- 3.10 多参数函数
- 3.11 带返回值的函数
- 3.12 术语
- 第4章 条件和递归
- 4.1 模运算符
- 4.2 条件执行
- 4.3 选择执行
- 4.4 链式条件
- 4.5 嵌套条件
- 4.6 return语句
- 4.7 递归
- 4.8 无限递归
- 4.9 递归函数的调用栈图
- 4.10 术语
- 第5章 带返回值的函数
- 5.1 返回值
- 5.2 程序开发
- 5.3 复合用法
- 5.4 重载
- 5.5 布尔值
- 5.6 布尔型变量
- 5.7 逻辑操作符
- 5.8 布尔函数
- 5.9 main函数返回值
- 5.10 多重递归
- 5.11信心的跳跃
- 5.12 更多的例子
- 5.13 术语
- 第6章 迭代
- 6.1 多次赋值
- 6.2 迭代
- 6.3 while语句
- 6.4 表格
- 6.5 二维表
- 6.6 封装和广义化
- 6.7 函数
- 6.8 更多封装
- 6.9 局部变量
- 6.10 更多广义化
- 6.11 术语
- 第7章 字符串和其他
- 7.1 字符串容器
- 7.2 apstring变量
- 7.3 字符串中的字符
- 7.4 长度
- 7.5 遍历
- 7.6 运行时错误
- 7.7 find函数
- 7.8 自定义find函数
- 7.9 循环和计数
- 7.10 递增和递减操作符
- 7.11 字符串拼接
- 7.12 apstring的可变性
- 7.13 apstrings的可比较性
- 7.14 字符分类
- 7.15 其他apstring函数
- 7.16 术语
- 第8章 结构体
- 8.1 复合值
- 8.2 Point对象
- 8.3 访问实例变量
- 8.4 操作结构体
- 8.5 将结构体作为参数
- 8.6 值传递
- 8.7 引用传递
- 8.8 矩形
- 8.9 返回结构体类型
- 8.10 将其他类型按引用传递
- 8.11 获取用户输入
- 8.12 术语
- 第9章 更多结构体
- 9.1 Time
- 9.2 printTime
- 9.3 对象函数
- 9.4 纯函数
- 9.5 const参数
- 9.6 修改器
- 9.7 填写函数
- 9.8 哪个最好
- 9.9 增量式开发VS规划
- 9.10 普遍化
- 9.11 算法
- 9.12 术语
- 第10章 vector
- 10.1 访问元素
- 10.2 复制vector
- 10.3 for循环
- 10.4 vector的长度
- 10.5 随机数
- 10.6 统计
- 10.7 随机数的vector
- 10.8 计数
- 10.9 检查其他值
- 10.10 直方图
- 10.11 单次遍历的解决方案
- 10.12 随机种子
- 10.13 术语
- 第11章 成员函数
- 11.1 对象和方法
- 11.2 print
- 11.3 隐式变量访问
- 11.4 另一个例子
- 11.5 第三个例子
- 11.6 更复杂的例子
- 11.7 结构体
- 11.8 初始化还是构造
- 11.9 最后一个例子
- 11.10 头文件
- 11.11 术语
- 第12章 包含对象的vector
- 12.1 复合形式
- 12.2 Card对象
- 12.3 printCard函数
- 12.4 equals函数
- 12.5 isGreater函数
- 12.6 包含Card对象的vector
- 12.7 printDeck函数
- 12.8 搜索
- 12.9 二分查找
- 12.10 vector和子 vector
- 12.11 术语
- 第13章 向量对象
- 13.1 枚举类型
- 13.2 switch语句
- 13.3 Deck
- 13.4 另一个构造函数
- 13.5 Deck成员函数
- 13.6 洗牌
- 13.7 排序
- 13.8 subdeck
- 13.9 洗牌和处理
- 13.10 合并排序
- 13.11 术语
- 第14章 类和不变式
- 14.1 私有数据和私有类
- 14.2 什么是类
- 14.3 复数
- 14.4 访问器函数
- 14.5 输出
- 14.6 支持复数运算的函数
- 14.7 支持复数运算的其他函数
- 14.8 不变式
- 14.9 先验条件
- 14.10 私有函数
- 14.11 术语
- 第15章 文件输入/输出和apmatrix
- 15.1 流
- 15.2 文件输入
- 15.3 文件输出
- 15.4 输入解析
- 15.5 数字解析
- 15.6 Set数据结构
- 15.7 apmatrix
- 15.8 距离矩阵
- 15.9 合适的距离矩阵
- 15.10 术语
- 附录A AP类的快速参考
- 版权声明
- 版权