1.return是 C++预定义的语句,它提供了终止函数执行的一种方法,当 return语句提供了一个值时,例如0,这个值就成为函数的返回值,return value返回值为 0 表示 main()函数成功执行完毕。标准 C++中 如果 main()函数没有显式地提供返回语句则它缺省返回0
2.标准 C++头文件没有后缀
3.在 C++标准库中定义的名字 如cout 不能在程序中直接使用 除非在预处理器指示符
#include <iostream>后面加上语句using namespace std; 这条语句被称作 using指示符,C++标准库中的名字都是在一个称作 std 的名字空间中声明的 这些名字在我们的程序文本文件中是不可见的 除非我们显式地使它们可见 using指示符告诉编译器要使用在名字空间 std 中声明的名字
4.为了使用 vector 对象 下面的头文件是必需的
#include <vector>
vector<string> chapter_titles( 20);
chapter_title是一个向量 包含有 20 个字符串类型的元素vector <string>指示编译器创建一个能够存放字符串元素的向量类型 要定义一个能够存放 20个整数的向量对象 我们可以这样写vector<int> ivec(20);
5.头文件通过 include 预处理器指示符而成为我们程序的一部分 预处理器指示符用 # 标识 这个符号将放在程序中该行的最起始一列上处理这些指示符的程序被称做预处理器 preprocessor 通常捆绑在编译器中
6.编译 C++程序时 编译器自动定义了一个预处理器名字__cplusplus 注意前面有两个下
划线 因此 我们可以根据它来判断该程序是否是 C++程序 以便有条件地包含一些代码
例如
#ifdef __cplusplus
// 不错 我们要编译 C++
// extern "C"
extern "C"
#endif
int min( int, int );
在编译标准 C时 编译器将自动定义名字__STDC__ 当然 __cplusplus 与__STDC__
不会同时被定义
另外两个比较有用的预定义名字是 __LINE__和__FILE__ __LINE__记录文件已经被
编译的行数 __FILE__包含正在被编译的文件的名字 可以这样使用它们
if ( element_count == 0 )
cerr << "Error: " << __FILE__
<< " : line " << __LINE__
<< "element_count must be non-zero."n";
另外两个预定义名字分别包含当前被编译文件的编译时间 __TIME__ 和日期__DATE__ 时间格式为 hh:mm:ss 因此如果在上午 8 点 17 分编译一个文件 则时间表示为 08:17:05 如果这一天是1996 年10月 31 日 星期四 则日期表示为Oct 31 1996
若当前处理的行或文件发生变化 则__LINE__和__FILE__的值将分别被改变 其他四个
预定义名字在编译期间保持不变 它们的值也不能被修改
7. assert()是C语台标准库中提供的一个通用预处理器宏 在代码中常利用 assert()来判断一 个必需的前提条件 以便程序能够正确执行 例如 假定我们要读入一个文本文件 并对其中的词进行排序 必需的前提条件是文件名已经提供给我们了 这样我们才能打开这个文件 为了使用assert() 必须包含与之相关联的头文件
#include <assert.h>
下面是一个简单的使用示例
assert( filename != 0 );
assert()将测试 filename不等于 0 的条件是否满足 这表示 为了后面的程序能够正确执行 我们必须断言一个必需的前提条件 如果这个条件为假 即 filename等于 0 断言失败 则程序将输出诊断消息 然后终止
assert.h是C库头文件的 C名字 C++程序可以通过 C库的 C名字或 C++名字来使用它这个头文件的 C++名字是 cassert C库头文件的 C++名字总是以字母 C开头 后面是去掉后缀.h 的 C名字 正如前面所解释的 由于在各种 C++实现中 头文件的后缀各不相同 因此标准 C++头文件没有指定后缀
#include <cassert>
将 cassert 的内容被读入到我们的文本文件中 但是由于所有的 C++库名字是在名字空间std 中被定义的 因而在我们的程序文本文件中 它们是不可见的 除非用下面的 using指示符显式地使其可见
using namespace std;使用 C头文件的#include 指示符#include <assert.h> 就可以直接在程序文本文件中使用名字 assert() 而无需使用 using指示符,库文件厂商用名字空间来控制全局名字空间污染 即名字冲突 问题 以避免它们的库 污染 了用户程序的名字空间
8.注释对不能嵌套 即一个注释对不能出现在另外一个注释对之中 请尝试在系统中编译下面的程序 它会使大多数编译器无法正常处理
#include <iostream>
/*
* 注释对 /* */ 不能嵌套
* 这里 不能嵌套 几个字将被认为是代码
* 还包括接下来的这几行
*/
int main() {
cout << "hello, world"n";
}
解决这种嵌套注释的一个办法是在星号和斜线之间加一个空格/ * * / 对于星号和斜线序列 只有当这两个字符之间没有被空格分割时 它们才被看作是注释符
9.C++的输入/输出功能由输入/输出流 iostream 库提供,输入/输出流库是 C++中一个面向对象的类层次结构也是标准库的一部分终端输入也被称为标准输入 standard input 与预定义的 iostream对象 cin 发音为 see-in 绑定在一起 直接向终端输出 也被称为标准输出 standard output 与预定义的iostream对象 cout 发音为 see-out 绑定在一起 第三个预定义 iostream对象 cerr 发音为 see-err 称为标准错误 standard error 也与终端绑定 cerr 通常用来产生给程序用户的警告或错误信息
操纵符在 iostream上执行的是一个操作,而不只是简单地提供数据,例如 endl 在输出流中插入一个换行符 然后刷新输出缓冲区 我们一般不写cout << '"n'; 而是写成cout << endl;