1.1
每个C++程序都包含一个或多个函数(function),其中一个命名为main。操作系统通过调用main来运行C++程序。
一个函数的定义包含四部分:返回类型(return type)、函数名(function name)、一个括号包围的形参列表(parameter list,允许为空)以及函数体(function body)。
main()函数的返回类型必须为int,及整数类型。
当return语句包含一个值时,此返回值的类型必须与函数的返回类型相容。
在大多数系统中,main的返回值被用来指示状态。返回值为0表明成功,非0的返回值的含义由系统定义,通常用来指出错误类型。
1.2 初识输入输出
C++并未定义任何输入输出(IO)语句,取而代之,包含了一个全面的标准库(standard library)来提供IO机制(以及很多其他设施)。
iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流。
一个流就是一个字符序列,是从IO设备读出或写入IO设备的。
术语“流”想要表达的是,随着时间的推移,字符是顺序生成或消耗的。
标准输入输出对象
标准库定义了4个IO对象。
cin 标准输入,istream类型的对象
cout 标准输出,ostream类型的对象
cerr 标准错误,ostream对象,用来输出警告和错误消息
clog ostream对象,用来输出程序运行时的一般性信息
系统通常将所运行的窗口与这些对象关联起来。因此,当我们读取cin,数据将从程序正在运行的窗口读入,当我们向cout、cerr和clog写入数据时,将会写到同一个窗口。
每个使用标准库设施的程序都必须包含相关的头文件。
#include指令和头文件的名字必须写在同一行中。
通常情况下,#include指令必须出现在所有函数之外。我们一般将一个程序的所有#include指令都放在源文件的开始位置。
在C++中,一个表达式产生一个计算结果,它由一个或多个运算对象和(通常是)一个运算符组成。
<
endl 操纵符(manipulator)的特殊值。写入endl的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。
缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。
使用标准库中的名字
标准库定义的所有名字都在命名空间std中。
通过命名空间使用标准库有一个副作用:当使用标准库中的一个名字时,必须显示说明我们想使用来自命名空间std中的名字。
::作用域运算符。
从流中读取数据
>>输入运算符接受一个istream作为其左侧运算对象,接受一个对象作为其右侧运算对象。它从给定的istream读入数据,并存入给定对象中。输入运算符返回其左侧运算对象作为其运算结果。
1.3 注释简介
注释的种类
C++中有两种注释:单行注释和界定符对注释。
单行注释以双斜线(//)开始,以换行符结束。
当前行双斜线右侧的所有内容都被编译器忽略,这种注释可以包含任何文本,包括额外的双斜线。
另一种注释使用继承自C语言的两个界定符( /* 和 */ )。这种注释以/*开始,以*/结束,可以包含除*/外的任意内容,包括换行符。
编译器将落在/*和*/之间的所有内容都当做注释。
注释界定符可以放置于允许放置制表符、空格符或换行符的地方。注释界定符可以跨越程序中的多行,但这并不是必须的。
注释界定符对通常用于多行注释,而双斜线注释常用于半行和单行注释。
注释界定符不能嵌套
如果需要在调试期间注释掉一些代码,最好的方式是用单行注释方式注释掉代码段的每一行。
1.4 控制流
对比for循环和while循环,两种形式的优缺点是什么?
两者能够完成的事情是一样的,
经过优化之后for和while生成的指令一模一样,没有区别。
for语句将初始化,循环条件和每次循环后对循环变量的修改放在一起,比较清晰直观,常用于能够
预先判断循环次数的循环或遍历中。
while语句的历史更久,表达方式上更自由灵活,常用于
无法事先判断循环次数的循环。譬如经典的计算C风格字符串的长度的代码,又如后根遍历二叉树的非递归实现。
读取数量不定的输入数据
#include
using namespace std;
int main()
{
int sum=0,value=0;
while(cin>>value)
{
sum+=value;
}
cout<
return 0;
}
当我们使用一个istream对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符,或遇到一个无效输入时(例如读入的不是一个整数),istream对象的状态会变为无效。处于无效状态的istream对象会使条件变为假。