0%

C++ Primer - 第 1 章 开始

  1. 每个 C++ 程序都包含一个或多个函数(function),其中一个必须命名为 main

  2. main 函数的返回类型必须为 int,即整数类型。

  3. 在大多数系统中,main 的返回值被用来指示状态。返回值 0 表明成功,非 0 的返回值的含义由系统定义,通常用来指示错误类型。

  4. 对于源文件(source file)的命名,不同编译器使用不同的后缀命名约定,最常见的包括 .cc .cxx .cpp .cp .c 等。

  5. 在 UNIX 和 Windows 系统中,执行完一个程序后,都可以通过 echo 命令获得其返回值。在 UNIX 系统中,通过如下命令获得状态:

    1
    echo $?

    在 Windows 系统中查看状态可键入:

    1
    echo %ERRORLEVEL%
  6. 编译器通常都包含一些选项,能对有问题的程序结构发出警告。我们习惯在 GNU 编译器中使用 -Wall 选项,在微软编译器中使用 /W4

  7. iostream 库包含两个基础类型 istreamostream,分别表示输入流和输出流。一个流就是一个字符序列,是从 IO 设备读出或写入 IO 设备的。术语“流”(stream)想要表达的是,随着时间的推移,字符是顺序生成或消耗的。

  8. 标准输入输出对象:cin cout cerr clog

  9. 输出运算符 << 接受两个运算对象:左侧的运算对象必须是一个 ostream 对象,右侧的运算对象是要打印的值。此运算符将给定的值写到给定的 ostream 对象中。输出运算符的计算结果就是其左侧运算对象。即,计算结果就是我们写入给定值的那个 ostream 对象。

  10. endl 被称为操纵符(manipulator)。写入 endl 的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。

  11. 标准库定义的所有名字都在命名空间 std 中。

  12. 输入运算符 >> 与输出运算符类似,它接受一个 istream 作为其左侧运算对象,接受一个对象作为其右侧运算对象。它从给定的 istream 读入数据,并存入给定对象中。与输出运算符类似,输入运算符返回其左侧运算对象作为其计算结果。

  13. 界定符对形式的注释是以 /* 开始,以 */ 结束的。因此,一个注释不能嵌套在另一个注释之内。

  14. 下列哪些语句是合法的?

    1
    2
    3
    4
    std::cout << "/*";
    std::cout << "*/";
    std::cout << /* "*/ " */;
    std::cout << /* "*/ " /* " /*" */;

    语句 1、2、4 是合法的,分别输出 /* */ /*

  15. 语句块(block),就是用花括号包围的零条或多条语句的序列。语句块也是语句的一种,在任何要求使用语句的地方都可以使用语句块。

  16. 每个 for 语句都包含两部分:循环头和循环体。循环头控制循环体的执行次数,它由三部分组成:初始化语句(init-statement)、循环条件(condition)和表达式(expression)。初始化语句定义的变量仅在 for 循环内部存在,在循环结束之后不能使用。初始化语句只在 for 循环入口处执行一次,循环体每次执行前都会先检查循环条件,表达式在 for 循环体之后执行。

  17. 观察下述代码片段:

    1
    2
    3
    int sum = 0, val = 0;
    while (std::cin >> val)
    sum += val;

    该代码片段的数据读取操作是在 while 的循环条件中完成的,while 循环条件的求值就是执行表达式:

    1
    std::cin >> val

    此表达式从标准输入读取下一个数,保存在 val 中。输入运算符返回其左侧运算对象,在本例中是 std::cin。因此,此循环条件实际上检测的是 std::cin。当使用一个 istream 对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符(end-of-file),或遇到一个无效输入时(例如读入的值不是一个整数),istream 对象的状态会变为无效。处于无效状态的 istream 对象会使条件变为假。因此,上述代码片段中,while 循环会一直执行直至遇到文件结束符(或输入错误)(最简单的方法是完成数字的输入后随便输入一个符号然后回车———博主注)。

  18. 将如下代码片段编译为可执行程序:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int sum = 0, val = 0;

    while (std::cin >> val)
    {
    if (std::cin >> val)
    std::cout << "haha" << std::endl;
    std::cout << "The number you input is " << val << std::endl;
    sum += val;
    }

    std::cout << "The sum of numbers you input is " << sum << std::endl;

    执行编译后的可执行程序,并输入序列 1 2 5 6 8 12 2? 3 5 后回车,得到如下输出,思考程序执行流程:

    1
    2
    3
    4
    5
    6
    7
    8
    haha
    The number you input is 2
    haha
    The number you input is 6
    haha
    The number you input is 12
    The number you input is 0
    The sum of numbers you input is 20
  19. 标准库头文件通常不带后缀,编译器一般不关心头文件的格式。

  20. 每个类实际上都定义了一个新的类型,其类型名就是类名。

  21. 包含来自标准库的头文件时,应该用尖括号 < > 包围头文件,对于不属于标准库的头文件,则用双引号 " " 包围。

  22. 大多数操作系统支持文件重定向,这种机制允许我们将标准输入和标准输出与命名文件关联起来:

    1
    addItems<infile >outfile

    假定程序已经编译为名为 addItems.exe 的可执行文件(在 UNIX 中是 addItems),则上述命令会从一个名为 infile 的文件读取数据,并将输出结果写入到一个名为 outfile 的文件中,两个文件都位于当前目录中。

  23. 成员函数(member function)是定义为类的一部分的函数,有时也被称为方法(method)。

  24. 点运算符(.)只能用于类类型的对象。其左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名,运算结果为右侧运算对象指定的成员。当用点运算符访问一个成员函数时,通常是想调用该函数。使用调用运算符(())来调用一个函数,调用运算符是一对圆括号,里面放置实参(argument)列表(可能为空)。

  25. 缓冲区(buffer) 一个存储区域,用于保存数据。IO 设施通常将输入(或输出)数据保存在一个缓冲区中,读写缓冲区的动作与程序中的动作是无关的。可以显式地刷新输出缓冲,以便强制将缓冲区中的数据写入输出设备。默认情况下,读 cin 会刷新 cout;程序非正常终止时也会刷新 cout。

  26. cerr 一个 ostream 对象,关联到标准错误,通常写入到与标准输出相同的设备。默认情况下,写到 cerr 的数据是不缓冲的。cerr 通常用于输出错误信息或其它不属于程序正常逻辑的输出内容。

  27. clog 一个 ostream 对象,关联到标准错误。默认情况下,写到 clog 的数据是被缓冲的。clog 通常用于报告程序的执行信息,存入一个日志文件中。

  28. 未初始化的变量(uninitialized variable) 未赋予初值的变量。类类型的变量如果未指定初值,则按类定义指定的方式进行初始化。定义在函数内部的内置类型变量默认是不初始化的,除非有显式的初始化语句。试图使用一个未初始化变量的值是错误的。未初始化变量是 bug 的常见成因。

  29. >>运算符(>>operator)输入运算符 从左侧运算对象所指定的输入流读取数据,存入右侧运算对象中:cin >> i 表示从标准输入读取下一个值,存入 i 中。输入运算符可以连接:cin >> i >> j 表示先读取一个值存入 i,再读取一个值存入 j。


Thank you for your donate!