前言:按照写博客的顺序我应该进行到的是简单的数据结构,但我在通过介绍开始阅读C++Primer这本书后,感觉到这本书太细节了,他会对C++每一个定义的名词都有专业的解释和应该注意的地方,当然这些都是我这个c++初学者的感觉,所以我会随时穿插一篇我认为这本书需要记忆的知识点的博客,也希望对大家有所帮助。第一章介绍的就是C++的基础语法,大部分内容与C语言相类似。
C++Primer介绍
c++Primer的作者是Stanley B.Lippman,Josée LaJoie和Barbara E.Moo。作者简介这里就不提及了,感兴趣的大家可以自行搜索一下。
这本书被全球C++程序员誉为“编程圣经”,就可以看出这本书的地位了,有关C++的好书有很多,但是选择一本教科书能够很好引领C++程序入门,并且能够在C++程序员成长的各个阶段都能够提供到位的技术指导和权威信息的话,C++Primer是第一选择。
有关这本书跟多的介绍大家自行搜索或者可以自己阅读一下这本书籍,这里就不过多介绍了。
第一章 开始
1.1编写一个简单的C++程序
每个C++程序都包含一个或多个函数(function),其中一个必须命名为main。操作系统通过调用main来运行C++程序。
int main()
{
return 0;
}
这个main函数什么也没干,仅仅返回给操作系统一个值。
函数定义包含四个部分:返回类型(return type),函数名(function name),一个括号包围的形参列表(parameterlist,允许为空)以及函数体(function body)。虽然main函数在某种程度上比较特殊,但是和其他函数是一样的。
main函数返回类型必须是int,即整数类型,参数列表可以为空(()里面什么也没有,也可以有其他形参类型)。
函数体是一个左花括号开始,以右花括号结束的语句块。
{
return 0;
}
这个语句块就一个语句return,结束函数运行。注意return语句末尾的分号。
1.1.1编译,运行程序
编写好程序,我们需要编译它。如何编译程序依赖于你使用的操作系统和编译器。你所使用的特定编译器的相关使用细节,应该查阅参考手册。
上面这是书上原句,这里不是本书重点而且已经超出了我的知识范围,所以感兴趣的自己查阅相关资料和视频,就不多说了。
1.2初识输入和输出
C++语言并未定义输入输出(IO)语句,而是包含了一个全面的标准库来提供IO机制。我们了解基本概念和操作即可。
iostream库包含了两个基础类型istream和ostream,输入流和输出流。(术语“流”表达的是,随着时间的推移,字符是顺序生成和消耗的)。
想要使用iostream库需要包含头文件:
#include <iostream>
向流写入数据
在C++中一个表达式产生一个计算结果,它由一个或多个运算对象一个运算符组成。
在标准输出上打印消息需使用输出运算符(<<)作用类似于C语言中printf:
std::cout<<"Enter two numbers:"<<std::endl;
在屏幕上打印出Enter two numbers:
<<运算符接受两个对象,左侧运算对象必须是ostream对象,右侧运算对象是要打印的值。此运算符讲给定的值写到给定的ostream对象中。输出运算符的计算结果就是其左侧运算对象。即,计算结果就是我们写入的给定值的那个ostream对象。
<<可以连续使用,例如上面语句就是连续使用,上面语句可以拆分为
std::cout<<"Enter two numbers:";
std::cout<<endl;
endl是一个操作符,这里的作用就是换行,类似于C语言里面的‘\n’。(写入endl的效果是结束当行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中)。
我们发现我们使用cout和endl时,需要有个前缀std::,原因是C++相较于C语言使用了一个新的概念,命名空间(namespace),不同命名空间都相当于一个作用域,互不影响,这样可以解决定义名字相同变量或函数产生错误。标准库所有名字都在命名空间std中。‘::’是作用域运算符,指定访问的作用域,如果前面什么也不添加,默认访问全局作用域。
从流读取数据
输入运算符(>>),它接受一个istream作为左侧运算对象,接受一个对象作为右侧运算对象。它从给定的istream读入数据,并存入给定的对象中。
想给变量输入赋值(作用相当于C语言的scanf):
int v1 = 0;
std::cin >> v1;
可以连续使用:
int v1 = 0,v2 = 0;
std::cin>> v1 >> v2;
1.3注释简介
注释可以帮助人类读者理解程序。注释通常用于概述算法,确定变量用途,或者解释晦涩难懂的代码段。编译器会忽略注释,因此注释对程序的行为或性能不会有任何影响。
C++中注释有两种,单行注释和界定符对注释。
单行注释以双斜线(//)开始,以换行符结尾。当前行双斜线右侧所有内容都会被编译器忽略。
界定符对注释(/*和*/)。以/*开始,以*/结束,可以包含除*/外任意内容,/**/里面之间所有内容都当做注释。
需要注意的是注释界定符是不能够嵌套的。
/*
* 注释对/* */不能嵌套。
* “不能嵌套”几个字会被认为是源码,
* 像剩余程序一样处理
*/
1.4控制流
语句一般是顺序执行的:语句块的第一条语句首先执行,然后是第二条语句,以此类推。但是程序设计语言提供了多种不同的控制流语句,允许我们写出更为复杂的执行路径。
1.4.1while语句
while语句会反复执行一段代码,直至给定条件为假为止。
写一个简单的程序:求1到10十个数字的和。
#include <iostream>
int main()
{
int sum = 0, val = 1;
//只要val小于等于10,while循环就会继续执行
while (val <= 10)
{
sum += val;//等同于sum=sum+val,将sum+val的值付给sum
++val;//每次循环让val自增1
}
std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
return 0;
}
上面的程序可以抽像为:
while语句的执行过程是交替检测condition条件和执行关联的语句statement,直到condition为假时停止。所谓条件(condition)就是一个产生真或假的结果的表达式。只要conditionwield真,statement就会继续执行。当执行完statement,会再次检测condition。如果condition仍为真,statement再次被执行。while语句持续交替检测condition和执行statement,直至condition为假为止。
所以我们给定的statement要能够使condition为假循环停止,以防死循环的发生。
我们还可以使用break使循环停止下来。
#include <iostream>
int main()
{
int sum = 0, val = 1;
//只要val小于等于10,while循环就会继续执行
while (1)//大于零的数字代表真,循环会一直进行不会停止
{
sum += val;//等同于sum=sum+val,将sum+val的值付给sum
++val;//每次循环让val自增1
//如果val==11,代表val从10自增到11,sum以及从1加到10,循环应该结束
if (val == 11)
{
break;//我们可以使用break强制跳出循环
}
}
std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
return 0;
}
运行的结果也是一样的。
1.4.2for语句
C++语言提供了又一种循环语句for语句。先看如何用,我们用for语句写一下从1-10数字和。
#include <iostream>
int main()
{
int sum = 0;
for (int val = 1; val <= 10; ++val)
{
sum += val;
}
std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
return 0;
}
与while执行结果一模一样,我们也看出来for与while的不同。
每个for语句都包含两部分:循环头和循环体。循环头控制循环体的执行次数,它由三部分组成:一个初始化语句(init-statement),一个循环条件(condition)以及一个表达式(expression)。
上面例子中初始化语句为int val=1;这里面的val仅仅在for循环内部存在,在for循环结束后不能使用。
循环条件val<=10;比较val的值和10,。循环体每次执行会检查循环条件。只要val<=10,就会执行for循环体。表达式在for循环体之后执行。
表达式++val,也就是val自增1.执行完表达式后,for语句从新检测循环条件,如果val的新值仍然小于10,就再次执行for循环体。执行完之后再次将val自增1,直到循环条件为假。
1.4.3读取数量不稳定的输入数据
还是与上面相类似的问题,如果我们想求用户输入的数字和,这种情况下我们不知道要对多少数字求和,这就需要不断读取数据直至没有新的输入为止。
#include <iostream>
int main()
{
int sum = 0, val = 0;
while (std::cin >> val)
{
sum += val;//等价于sum=sum+val;
}
std::cout << "Sum is " << sum << std::endl;
return 0;
}
while的循环条件的求值就是执行表达式std::cin>>val;
当我们使用一个istream对象(本例子中为std::cin)作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符(end-of-file),或遇到一个微小的输入时(例如读入的值不是一个整数),istream对象的状态会变成一个无效状态。处于无效状态的istream对象会使条件变为假。
1.4.4if语句
我们上面使用过一次if语句。
#include <iostream>
int main()
{
int sum = 0, val = 1;
//只要val小于等于10,while循环就会继续执行
while (1)//大于零的数字代表真,循环会一直进行不会停止
{
sum += val;//等同于sum=sum+val,将sum+val的值付给sum
++val;//每次循环让val自增1
//如果val==11,代表val从10自增到11,sum以及从1加到10,循环应该结束
if (val == 11)
{
break;//我们可以使用break强制跳出循环
}
}
std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
return 0;
}
与while语句类似,if也对一个条件进行求值。如果条件为真则执行if内语句,否则不执行。
这几个控制流书上都是简单介绍用法,具体细节本文也不添加,我们C++部分内容是与C语言一样的,基本的语法不清楚的可以自行查阅一下。
总结:其实第一章还有个1.5类的介绍,但是我感觉这个类的介绍比较简单,只是一个引子,我后面的博客会很具体的介绍类这一个主题,所以本篇文章就不写类的内容了。第一章开始也只是一个引子,没有那么多的知识点的介绍,但是下一章可是干货满满,大家期待一下。
这个C++Primer有关的博客,可能会产出的很慢,因为我需要先读这本书,然后在具体理解书上的知识点,然后才能写出博客,希望大家理解。