C++ Primer 5th Ch01 开始
C++ Primer 5th Ch01 开始

Directory


Note:

命名空间

namespace,避免名字定义冲突

作用域运算符

::, 通过使用作用域运算符指出定义在命名空间的名字

class,即自定义数据结构,一个类定义了一个类型以及与其关联的一组操作

内置类型

build-in type, 由语言定义的类型

IO对象

标准库定义了4个IO对象

  • cin标准输入,
  • cout标准输出。
  • cerr对象又叫标准错误,通常用来输出警告和错误信息给程序的使用者,默认情况下,写到cerr的数据是不缓冲的。
  • clog对象用于产生程序执行的一般信息。

操纵符

endl,效果:1. 结束当前行 2. 将与设备关联的缓冲区中的内容刷到设备中,保证所有输出的写入。

iostream

iostream: IO标准库,包含两个基础类型,输入流istream和输出流ostream。


Comment

函数返回值与多文件执行

main()函数详解

函数返回值

main()函数返回值分为0与非0两两种。当main()返回0时,表示程序正常运行并正常退出;当返回非0时,表示程序运行异常或运行结果不是预期结果,返回的数值用于表示程序逻辑中定义的结果标识。 在Mac/Linux Terminal终端下,运行任何一个命令后,都可以通过echo $?来查看main()函数的返回值,如下:

$ gcc -o argPrint argPrint.c 
$ echo $?
0

在Window下,则通过echo %ERRORLEVEL%来获取main()函数返回值,如下:

在Terminal下,&&逻辑控制符会受main()的返回值会影响。 如下示例中,通过&&先后运行return_error和hello_world,由于代码中设置return_error返回值是1,则不继续往下执行hello_world。 但如果使用的是&,则不会因return_error的结果影响后续的hello_world的执行。这是由于&&是逻辑控制符,只要有一个条件不符合结果,则不会继续往下执行;但&是运算操作符,会执行所有的命令。见下图。

### hello_world.c
#include <stdio.h>

int main(int argc, char *argv[]){
    printf("hello world.\n");
    return 0;
}

### return_error.c
#include <stdio.h>

int main(void) {
    printf("run return_error:1.\n");
    return 1;
}

执行结果如下:

$ ./return_error && ./hello_world
run return_error:1.
$ ./return_error & ./hello_world
[1] 1748
run return_error:1.
hello world.
[1]+  Exit 1                  ./return_error
$ ./hello_world & ./hello_world
[1] 1750
hello world.
hello world.
[1]+  Done                    ./hello_world

Exercise:

1.1 查阅你使用的编译器文档,确定它所使用的文件命名约定。编译并运行第2页的main程序。

​ 编译器:g++

​ gcc 和 g++分别是GNU的C和C++的编译器。一般分成四步:

  • 预处理,生成.i的文件 [预处理器cpp]
  • 将预处理后的文件转换成汇编语言,生成.s文件[编译器egcs]
  • 由汇编变为目标代码(机器代码)生成.o文件[汇编器as]
  • 连接目标代码,生成可执行程序 [链接器]

1_1_main.cpp

int main()
{
    return 0;
}

1_1_main_1

1.2 改写程序,让它返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。

1_2_main.cpp

int main()
{
    return -1;
}

1_2_main_1

为什么是255?

依赖于机器的定义,大部分的机器定义int类型为8位,main函数返回值范围在0-255之间。

main return value range

1.3 编写程序,在标准输出上打印 Hello, World。

1_3_main.cpp

1_3_main_1

1.4 我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。

1_4_main.cpp

1_4_main_1

1.5 我们将所有输出操作放在一条很长的语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中。

……有毛病吗?

1.6 解释下面程序片段是否合法。

std::cout << "The sum of " << v1;
		  << " and " << v2;
		  << " is " << v1 + v2 << std::endl;

如果程序是合法的,它的输出是什么?如果程序不合法,原因何在?应该如何修正?

不合法,语句中不应该用分号分割,

或者在第二三行添加cout。

1.7 编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。

1_7_main.cpp

1_7_main_1

可以看出clang++明确指出了cmment的问题,不过应该是在编译时加上了-Wcomment。

1.8 指出下列哪些输出语句是合法的(如果有的话):

std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */;
std::cout << /* "*/" /* "/*" */;

预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将上述一条语句作为其主体),改正每个编译错误。

1、2没有问题

3 缺少,也就是说将前面的引号放在了注释里。

1_8_main.cpp

1_8_main_1

4 没有问题,打印/*

1.9 编写程序,使用while循环将50到100的整数相加。

1_9_main.cpp

3825

1.10 除了++运算符将运算对象的值增加1之外,还有一个递减运算符(–)实现将值减少1。编写程序,使用递减运算符在循环中按递减顺序打印出10到0之间的整数。

1_10_main.cpp

10 9 8 7 6 5 4 3 2 1

1.11 编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。

1_11_main.cpp

1.12 下面的for循环完成了什么功能?sum的终值是多少?

int sum = 0;
for (int i = -100; i <= 100; ++i)
	sum += i;

1_12_main.cpp

从-100加到100, 终值为0.

1.13 使用for循环重做1.4.1节中的所有练习(第11页)。

1_13_main.cpp

1.14 对比for循环和while循环,两种形式的优缺点各是什么?

For vs. while in C programming?

  • 循环进行下去的前提条件不同。

    while先判断,do while后判断,for也属于先判断,同时允许定义一个计数变量。

  • 从速度和编译性能测试来说,编译后的循环语句类似,do while少用一条jmp语句。

1.15 编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器生成的错误信息。

懒得编代码了

就是基本的语法错误、类型错误和声明错误。这些都属于编译器可以检查出来的错误。

1.16 编写程序,从cin读取一组数,输出其和。

这和P13的例子有什么区别?

1_16_main.cpp

1.17 如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?

如果所有值相等,只会打印一条信息。没有重复值的情况下,每个值的count均为1.

1.18 编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。

1_18_main.cpp

1_18_main_1

1.19 修改你为1.4.1节练习1.11(第11页)所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况。

1_11_main.cpp

1.20 在网站http://www.informit.com/title/032174113 上,第1章的代码目录包含了头文件 Sales_item.h。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。

1_20_main.cpp

头文件好强大,重载了= != + == += » «等等运算符

1.21 编写程序,读取两个 ISBN 相同的 Sales_item 对象,输出他们的和。 1_21_main.cpp

1_21_main_1

1.22 编写程序,读取多个具有相同 ISBN 的销售记录,输出所有记录的和。 1_22_main.cpp 与1.18类似

1_22_main_1

1.23 编写程序,读取多条销售记录,并统计每个 ISBN(每本书)有几条销售记录。

1_23_main.cpp 与1.18类似

1_23_main_1

1.24 输入表示多个 ISBN 的多条销售记录来测试上一个程序,每个 ISBN 的记录应该聚在一起。

这就是目前程序的问题,因为简单,所以只能检测到连续的输入。想要改进的话只有保存每一次的输入进而统计次数。

1.25 借助网站上的Sales_iteam.h头文件,编译并运行本节给出的书店程序。

1_25_main.cpp 相比1.24,只是不做计数,直接计算total销量值。

上一篇   C++ Primer 5th Plan

下一篇   C++ Primer 5th Ch02 变量和基本类型