就这样开始了我的第一篇CSDN文章。C++程序员的圣经,我学习的第二本书。
本章的练习都非常基础,就没有记录在笔记当中了,后面的章节中,有不错的练习,也会将练习的程序分享出来。
1.1 编写一个简单的C++程序
每个C++程序都必包含一个名为main的函数,操作系统通过调用main函数来运行C++程序(就我现在所了解的,main函数这个程序的入口也是可以通过某种手段更改的)
函数定义的四个部分:返回值类型,函数名,形参列表,函数体。
就C++学习以来mian函数的参数列表一直为空,但main函数也是可有其它形参类型的(后面会讲解,拭目以待吧)
1.1.1 编译、运行程序
哈哈,说了一堆完全不懂的东西,什么集成IDE之类的,不是重点,罢了。就简单的查找了一下,我所用的VS编译器应该就是一个IDE。
程序源文件约定:大多数编译器都要求源码储存在一个或多个文件当中。程序文件被称为源文件。在大多数系统中源文件以一个后缀结尾,这个后缀具体是什么,视编译器而定,就VS而言是.cpp
从命令运行编译器
可怜的我,只用过window系统,也自会点一个VS编译器中的编译并运行按钮,下面的内容多半有点懵,那就查一查,敲一敲了。
如果我们正在使用命令行界面,那么通常在一个控制台窗口内编译程序。假定我们的main程序保存在文件prog1.cc中,可用如下命令编译它
$ CC prog1.cc
其中,CC是编译器程序的名字,$是系统提示符。编译器生成一个可执行文件,windows系统将可执行文件命名为 prog1.exe。UNIX系统中的编译器通常将可执行文件命名为 a.out。
要在windows系统中运行可执行文件,我们需要提供可执行文件的文件名,可以忽略其扩展名 .exe
$ prog1
在一些系统中,及时文件就在当前目录或文件夹中,也必须显示指出文件位置。在此情况下,我们可以键入
$ .prog1
"."指出该文件就在当前目录中。
要在UNIX系统中运行一个可执行文件,我们需要使用全文件名,也即扩展名包括在内:
$ a.out
如果需要指定位置,需要一个"./"指出可执行文件位于当前目录中。
$ ./a.out
访问main的返回值的方法依赖于系统。在UNIX和Windows系统中,执行完一个程序后,都可以通过echo命令获得状态:
在UNIX系统中,通过如下命令获得状态:
$ echo $?
在Windows系统中查看状态可键入:
$ echo %ERRORLEVEL
(我试验了用Developer Command prompt for VS 2019 来尝试上面的内容。这个“$”属实不懂,反而是把"$"换成了“cl” “start”一类的指令才执行了想要的效果,由此推算,这个"$"就像一个未知数,具体应该是啥,自己摸索喽。)
1.2 初识输入输出
C++语言并未定义任何输入输出语句,取而代之,包含了一个全面的标准库来提供IO机制。
iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流。
标准输入输出对象
标准库定义了4个IO对象,分别是
istream对象 cin 标准输入
ostream对象 cout 标准输出
ostream对象 cerr 标准错误
ostream对象 clog 输出一般性信息
#include指令和头文件名字必须写在同一行中。通常情款下#include指令必须出现在所有函数之外。一般将#include指令放在源文件的开始位置。
向流写入数据
在C++中一个表达式产生一个计算结果,它由一个或多个运算对象和(通常是)一个运算符组成。
简单说一下输出运算符 << (也有称之为 左移运算符 的)。(在未重载的情况下)左侧对象必须是一个ostream对象,右侧是要打印的值。<<运算符将右值写到了左值ostream对象当中,并且返回ostream对象本身(*this),该返回值体现了链性编程的特点,这也是可以连着使用<<运算符的原因。
endl,是一个被称为操作符的特殊值。写入endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷新到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。(关于缓冲区这个东西,我了解的还非常少。)
使用标准库中的名字
这节案例非常基础,(以至于让我感觉花费多倍的时间去记录这章的笔记不大划得来),类似于下面这样。
#includeint main() { std::cout << "hello world" << std::endl; return 0; }
这里想说的问题就是,使用cout对象,以及endl操作符,前面都加上了std::
没错,目前这个程序它必须这样,它目前并没包含我们几乎会无脑加上的 uisng namesapce std;
std::指出了名字 cout 和 endl 是定义在名为 std 的命名空间中的。
从流读取数据
输入运算符 >> ,它接收一个istream对象作为其左侧运算对象,接收一个对象作为其右侧运算对象。>>从左值读入数据,并存入右值当中,该表达式的计算结果依旧是istream对象本身。
1.3 注释简介
单行注释 //
从双斜杠开始到换行符为止,所有的内容都是注释。
多行注释
这种注释继承至C语言的两个界定符 ( )。
之间的所有内容均为注释,可跨越多行
1.4 控制流
哇,for,while,if 啥的我是真不想记录笔记了,容我只快速浏览一下吧,有啥冷门的细节点就提及一下,不会对这些东西做过多的记录了。
1.4.1 while语句
所谓条件就是一个产生真或假的结果的表达式。条件为真,while循环的关联语句就会执行。
所谓语句块,就是用花括号包围的零条或多条语句序列。语句块也是语句的一种,在任何要求使用语句的地方都可以使用语句块。
1.4.2 for语句 略
1.4.3 读取数量不定的输入数据
这里想说的就是下面这两句代码
int value = 0;
while (std::cin >> value) {};
前面说过,输入运算符的返回结果是istreaam对象本身。所以这里循环条件检查的也正是我们的istream对象 std::cin。
当我们使用一个istream对象作为条件时,其效果是检查流的状态。(条件判断的本质还是真和假,只是不同的流状态会产生真或假两种结果)如果流是有效的,即输入未遇到错误,那么检查成功。当遇到文件结束符(end-of-file,简称 eof)或遇到一个无效输入的时候(就本例而言,例如读入值不是一个整数),istream对象会变为无效。处于无效状态的istream对象会使条件变为假。
那么如何从键盘上输入一个eof呢?就windows系统而言是输入 ctrl + z,而UNIX系统和Mac OS X系统中是输入 ctrl + d。
1.4.4 if语句
这一小节实现了一个统计某值出现了多少次的程序,如下:
#includeusing namespace std; //首先,要明确,cin里的数据是读取一个少一个,每读取一个便开始执行一次 int main() { int currVal = 0, val = 0; if (cin >> currVal) { int cnt = 1; while (cin >> val)//会把cin里面的值拿完,每取一个值便执行一次while循环 { if (val == currVal) { cnt++; } else//刚读取的这个数和上一个数不同(在相同的数连在一起的情况下,我们可以认为上一个数的统计已经完毕了),输出上一个数的信息。 { cout << currVal << " occurs " << cnt << " times" << endl; currVal = val; cnt = 1; } } cout << currVal << " occurs " << cnt << " times" << endl;//cin里面的数据已经读完了,最后一种值未能在while里面输出,我们需要再输出一次。 } system("pause"); return 0; }
哦,不得不说这个版本的功能实现很不理想。它要求我们输入的相同数据必须是连续的,而且如果我们一个一个输入的话,给予反馈的过程也非常的怪异(也没有防错机制,不要相信用户永远是对的)。
引发这种问题的原因在哪里呢?我认为在于没有一组数据的储存机制,每个要统计的值的生命周期过短,仅仅只有一个循环,出于这一点,我们必须在一个循环内完成对数据的统计和输出,因此产生了很多局限性。
如果以我现在所学的知识来处理,应当会使用数组或者容器去记录要统计的数,重复出现,次数加一,出现新的,放入容器。(再具体一些的话,比如用map容器,key为要统计的数,value为出现的次数。或者创建一个class 包括数据本身,以及该数据出现次数,用一个vector去容纳该class的对象。)
1.5 类简介 略
1.5.2 初始成员函数
成员函数是定义未类的一部分的函数,有时也被称为方法。
item.isbn();
使用点运算符(.)来表达我们需要“名为item的对象的isbn成员”。点运算符只能用于类类性的对象(点运算符也是少数不能被重载的运算符之一)。其左侧对象必须是一个类类型对象,右侧必须是一个该类型的一个成员名,运算结果为右侧运算对象指定的成员。
1.6 书店程序
如果你理解了我在1.4.4章的吐槽,那么你也应该明白,这个程序也是不理想的。它们有着相同的问题。希望书本会在后面给出更完善的版本。(按照该书作者的习惯,应该也是会给出优化版的)。
好了,我的第一篇文章就这样告一段落了,如标题,这是一个随笔,一遍阅读,一边编写,记录我阅读时的感想和思考,希望对你能有帮助,当然,如果文章里有错误也请指出,我会及时更正。
哈,记录这些内容太花费我的时间了,我现在的学习时间可谓捉襟见肘了,但随笔我还是想写下去,可能后面的随笔会更加精简吧,甚至会精简到仅仅是我的个人定制版。
参考书籍
《C++ Primer (第5版)》



