希望每一位从这里开始阅读本笔记的小萌新们都是从C/C++开始接触编程语言的。
也许很多人在接触C/C++之前都会看到网络上铺天盖地的“难学”二字,而在学习C/C++前犹豫不决。但是,这是完全没有必要的。
我希望大家不要在自己走出第一步时就被编程语言所击垮——我希望大家能够明白编程语言最终只是工具,什么语言好用只是个人的习惯,而最终我们解决问题的核心绝对不是编程语言(即使我们确实有学习编程语言的必要)。
编程语言不存在难学的情况,只是有的人天赋很高,有的人十分勤奋,但是最怕的就是既没天赋、又好懒怕累、甚至眼高手低。我希望大家能够明白,比起学习或者生活中的其他困难,编程语言真的不难(还是恋爱什么的最难趴?)。因此,我们要做的就是踏实学习、刻苦学习,即使你有天赋你也得这样,因为这样节省你的时间以便能够学习更多的内容,如果没有天赋就更应该这样——不过,话又说回来,有没有天赋这种事,不试到最后你又怎么知道?
第一本笔记《C++基础编程技术》是学习任何编程语言都应该掌握的基础内容(也是大学非计算机学科的大学计算机基础的内容,即使他们学习的是C语言)。
如果到现在,大家已经坚定了自己继续学习C++的信念的话,那么我们现在就开始吧。
1.1.1 让我们迈出C++编程的第一步吧!
目录
00 准备
IDE的准备
创建新项目
01 C++程序怎么写?
C++代码构架
调试方法
02 我想要打一行Hello World
03 注释怎么写?
04 数据类型都有些什么?
变量与常量
标识符
数据类型
数据类型——整型
数据类型——浮点型
数据类型——字符型和字符串型
数据类型——布尔型
数据类型——转义字符
05 判断数据类型长度符——sizeof函数
06 我想写下她的名字
我们建议使用Visual Studio这款强大的IDE进行下面的学习。
Visual Studio Installer下载地址为:
https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community&rel=16
在Visual Studio Installer中选择下面的选项:
等待安装完成,一切即将就绪……
当然,如果您习惯使用其他的适用于C++的编译器,那也完全没问题,继续使用您喜爱的编译器吧!
对于初学者,有必要先说明如何创建一个新项目:
首先在启动界面点击创建新项目:
之后,选择空项目:
然后,配置新项目,填写项目名称、位置:
最后,在源文件中添加.cpp文件:
现在,你已经学会了如何用Visual Studio创建一个自己的新项目了!
如果没有其他问题,让我们继续开始下面的学习吧。
首先我们看下面的代码:
#include<iostream> using namespace std; int main() { system("pause"); return 0; }
初学者此时必然一脸懵逼:这啥玩意?
我们希望初学者不必细究上面这段代码的细节,而是直接把上面这段代码背下来。这有利于快速入门C++编程,而不是浪费时间在细究之后会学习到的细节问题。
如果您说:我背不下来啊。
那么请将上面的代码抄上十遍,二十遍,直到背下来为止(严肃)!
上面的代码几乎是写C++程序首先必写的代码,请务必牢记,并且在每次学习的开始将这段代码提前打出。
下面,我们学习调试方法:
我们编译并且调试这段代码,调试方法如下:
点击本地Windows调试器,运行结果如下:
回车之后,程序结束:
我们要注意:C++代码是从上往下执行的,也就是说,我们首先执行了下面一行代码:
system("pause");这行代码的意思就是显示出来的:请按任意键继续...
之后,运行下面的代码:
return 0;这行代码的意思就是:程序结束。
我们现在知道这些意思就可以了,其中 system("pause"); 对于算法竞赛来说是不能添加的,但是设计程序经常需要用到。
看,我们经过短短几分钟的学习,就学会了“怎么编程”了!
请不要现在嘲笑我或者嘲笑自己,你很快就会明白:很多人上了一学期的C语言课程,懂的内容仅限于此。
在C++中,我们多使用标准输出流cout进行数据的输出。我们在 01 C++程序怎么写? C++代码构架 的代码中添加下面这一行代码:
cout << "Hello World!" << endl;整体代码如下:
#include<iostream> using namespace std; int main() { cout << "Hello World!" << endl; system("pause"); return 0; }输出结果如下:
其中,对于输出内容,我们使用 << 表示输出流运算符,想要输出的内容包含在 " " 中,最后的 endl 表示输出内容的一行结束。
对于cout我们目前没有必要深究,只需要明白它可以用来输出、并且可以连续输出即可。
实际上,上面的Hello World和下面的代码又有什么本质上的区别?
#include<iostream> using namespace std; int main() { cout << " ********" << endl; cout << " ************" << endl; cout << " ####....#." << endl; cout << " #..###.....##...." << endl; cout << " ###.......###### ### ###" << endl; cout << " ........... #...# #...#" << endl; cout << " ##*####### #.#.# #.#.#" << endl; cout << " ####*******###### #.#.# #.#.#" << endl; cout << " ...#***.****.*###.... #...# #...#" << endl; cout << " ....**********##..... ### ###" << endl; cout << " ....**** *****...." << endl; cout << " #### ####" << endl; cout << " ###### ######" << endl; cout << "##############################################################" << endl; cout << "#...#......#.##...#......#.##...#......#.##------------------#" << endl; cout << "###########################################------------------#" << endl; cout << "#..#....#....##..#....#....##..#....#....#####################" << endl; cout << "########################################## #----------#" << endl; cout << "#.....#......##.....#......##.....#......# #----------#" << endl; cout << "########################################## #----------#" << endl; cout << "#.#..#....#..##.#..#....#..##.#..#....#..# #----------#" << endl; cout << "########################################## ############" << endl; return 0; }
看,我们又用了短短的一两分钟就学会了怎么用C++输出内容。
对于初学者来说,你已经超越了大多数人——很多人在初学阶段一个晚上都搞不定这点内容。
C++注释有两种写法——单行注释和多行注释。写法如下:
//这是单行注释 /* 这是多行注释 */一般来说,单行注释列在一行代码的末尾或者单独占一行,而多行注释用于多行或者一行中间的注释。如何使用需要根据情景分析。
但是以上都不是重点,重点是——养成写注释的好习惯!
写注释的必要性在于:
1.以后能看懂自己写的代码
2.别人能够看懂自己写的代码
随着代码量的逐渐增加,读者自然能够体会到这一点。
为了自己和他人的身心健康,务必写上关键的注释!
注释就这么点东西,我们快点进入下一节的学习吧!
简单来说,数据类型就是为了给变量分类。
那么,我们首先应该搞懂,在C++中,变量指的是什么?事实上,变量是编程中最基本的储存单位,会暂时放入相应的内容。
C++中的量整体上可分为常量和变量,类似于数学,变量就是可以变化的量,常量就是不可变化的量。
变量和常量的语法如下表:
分类语法举例特点变量数据类型 变量名 = 初始值;int a = 10;值可以变化常量#define 常量名 常量值#define len = 10;通常在文件上方定义,值不能变化
const 数据类型 常量名 = 常量值const int a = 10;在变量定义面前加上关键词const,修饰该量为常量,值不能变化上面的常量定义方法有两种,需要牢记。
前面我们介绍了变量的赋值方式:
标识符 赋值符 值
a = 10
简单来说,标识符就是名字。现阶段,我们只需要理解变量名是标识符即可。
标识符有其相应的命名规则。通常来说,有以下几点:
1.必须以字母或者下划线开头。通常容易犯的错误是以数字开头。
2.不能与关键字冲突。关于C/C++的关键字读者可自行上网查询。
3.大小写敏感。例如,main和Main不是一个东西。
我们要明确:在C++中,我们将数据储存在内存中,而定义变量名的目的就是为了通过变量名更方便地访问这块内存中的数据。
也许上面这段话对于初学者来说还不是很好理解,但是在后续的学习中读者必然能对这句话有更深刻的体会。
下面,我们来详细学习各种数据类型。
C++的主要数据类型分为:
数据类型占用空间含义短整型short2字节表示 -2^15 ~ 2^15-1 范围的整数整型int4字节表示 -2^31 ~ 2^31-1 范围的整数长整型longWindows中为4字节,Linux中为4字节(32位)/8字节(64字节)表示 -2^31 ~ 2^31-1 范围的整数长长整型long long8字节表示 -2^63 ~ 2^63-1 范围的整数单精度浮点型float4字节表示7位有效数字的小数双精度浮点型double8字节表示15~16位有效数字的小数,对于小数编译器默认为double类型字符型char1字节表示单个字符,表示的字符应用单引号括起来字符串型char [] 表示一串字符,表示的字符串应用双引号括起来string 布尔型bool1字节只有两个值:
true ----- 真 (本质是1)
false ----- 假 (本质是0)
下面,我们对每种数据类型举例分析:
顾名思义,整型就是整数类型。
整型常用的有四种,即为短整型(short)、整型(int)、长整型(long)、长长整型(long long)。
在Windows中,int 和 long 是完全相同的。其余整型的区别就是在于表示整数的范围不同。
代码举例如下:
#include<iostream> using namespace std; int main() { //短整型 short a1 = 1; //整型 int a2 = 10; //长长整型 long long a3 = 100; system("pause"); return 0; }另外,我们还要指出下面这行代码:
unsigned int a4 = 10; //绝对值整型unsigned 表示“无符号”,也即绝对值的意思。
例如,int 类型的范围为 -2^31 ~ 2^31-1 ,unsigned int 类型的范围为 0~2^32-1。
因此,很多情况下,当我们想要使用比long long更大的整型范围时,可以采用绝对值的形式。
浮点型的作用很直接,就是用来表示小数的。
浮点型有 float(单精度浮点型) 和 double(双精度浮点型) 两种类型,这两种类型的唯一区别是有效数字不同。
我们看下面的代码:
这个很有意思:编译器默认小数是double类型的。
我们换一种方式:
在数的后面加上f就可以声明为float类型了。
单精度/双精度浮点型代码举例如下:
#include<iostream> using namespace std; int main() { //单精度浮点型 float f1 = 3.14;//编译器默认小数为double类型 float f2 = 3.14f;//加上f后为float类型 //双精度浮点型 double d1 = 3.1415926; system("pause"); return 0; }
字符型就是一个一个的字符。每个字符型数据只能表示为一个字符。
字符型数据表示的字符必须用单引号括起来。
代码示例如下:
#include<iostream> using namespace std; int main() { //字符型 char c1 = 'c'; system("pause"); return 0; }字符串型分为 char [] 和 string 两种。
代码示例如下:
#include<iostream> using namespace std; int main() { //字符串型 char str1[] = "Hello World!"; string str2 = "Hello World!"; system("pause"); return 0; }对于 char [] 类型,我们可以简单的将它看作字符数组(数组是什么?就简单的理解为有序的一串数据吧。在之后我们会详细讨论的)
对于 string 类型,我们目前也可以把它一样看作字符数组。但是string本质上事实上并不是简单的一个字符数组,我们在学习到泛型编程之后就会对string类有更加深刻的理解,也能够认识到C++的强大之处。
bool(布尔)型是表示真假的数据类型,常作为函数的返回值,返回一个结果的真假(在这里函数的返回值并不需要深究,在之后马上就会介绍)。
我们执行下面的代码:
#include<iostream> using namespace std; int main() { //布尔类型 bool x = true; cout << "x = " << x << endl; bool y = false; cout << "y = " << y << endl; system("pause"); return 0; }输出结果:
从上述代码可以看出:bool类型的两个值——true 和 false,本质上是 1 和 0 。
对于bool类型,我们将它看作是表达式真假的值,并且知道它常常作为函数的返回值使用即可。
最后,我们介绍一种显得有些特殊的数据类型——转义字符。
在学习转义字符前,我们要求读者对ASCII码有一个基本的了解。
在对ASCII码有一个基本的了解之后,我们知道:所有的ASCII码都可以通过以下的形式来表示:
\数字当然,我们知道,有些ASCII码是不能显示出来的,常见的例如换行、制表等。
对于这样的ASCII码,我们使用下面的转义字符来表示:
\字母事实上我们目前需要的转义字符也不是很多,常见的有:
\n换行,将当前位置移到下一行开头\t水平制表(TAB)\\代表一个反斜线字符 “ \ ”\'代表一个单引号(撇号)字符\"代表一个双引号字符\?代表一个问号字符这些转义字符到底有什么用处呢?前两个很好理解,是表示换行、制表这些“不能显示的”ASCII字符,为什么后4个也需要这样表示呢?
学习到后面我们会发现:编译器会将很多字符不视为其本身。
例如,我们想要输出一个双引号,正常来说我们会打出这段代码:
cout << """ << endl;但很可惜,这会报错。编译器认为里面的双引号将要表示字符串,而右引号没有闭合。
我们使用转义字符:
cout << "\"" << endl;现在可以顺利输出了。
这是转义字符的一个直观应用。制表符和换行符是十分常用的,在之后的项目中我们会大量使用这两个转义字符,因此请务必熟悉。
此外,转义字符还会广泛用于诸如LaTeX左右引号等等问题。有兴趣的读者可以自行了解。
最后,我们希望读者注意:转义字符本质上属于字符常量,因此必须包含在单引号/双引号内编译器才能识别。
至此,对于数据类型的学习我们就告一段落了。
我们希望读者都能对这些数据类型了如指掌。也许你一下子不能很好记住全部的数据类型,不过这是完全没有关系的。在后面的学习中,我们与数据类型是分不开的,读者将会在大量的接触中加深对知识的印象。养成良好的复习习惯,避免对知识的遗忘,是在之后的C++的学习过程中最重要的方法之一。
接下来,我们将要介绍的是:sizeof函数。
顾名思义,sizeof函数就是判断数据类型所占内存大小的。
我们先看下面的代码:
#include<iostream> using namespace std; int main() { int a = 10; cout << "a的大小为:" << sizeof(a) << endl; cout << "int的大小为:" << sizeof(int) << endl; system("pause"); return 0; }输出结果为:
我们下面来理解一下这段代码:
首先我们先简单理解一下函数:对于有返回值的函数,我们可以将括号内的值理解为中的参数,而返回值理解为中的,显然,实际上表示的就是返回值(执行一个函数,最终返回一个值)。
在 sizeof函数中,参数可以为:sizeof(变量/数据类型),上述代码即表示了这两种传参方式。
在之前的学习中,我们知道:int 类型占用空间的大小即为4字节。我们输出的结果证明了这一点。
从上面的例子中,我们确确实实知道了:sizeof函数就是判断数据类型所占内存大小的。
但是sizeof到底有什么作用呢?我们真的需要单独根据占用内存大小去判断数据类型吗?(C++必须确定变量类型)
事实上,sizeof的作用从下面的代码中可以体现:
#include<iostream> using namespace std; int main() { int arr[] = { 1,2,3,4,5,6 }; cout << sizeof(arr) / sizeof(arr[0]) << endl; system("pause"); return 0; }输出结果为:
是不是明白了什么呢?
对于sizeof函数,我们明确一点即可:我们关心的不是大小,而是数量。
不能完全理解上面的代码也没有关系,这只是一些知识的细节问题。相反,我们希望读者能够重视总结出来的规律和思想,这是更为关键的。
来到这里,相信有的小萌新可能会学的很轻松,有的小萌新可能会觉得理解上有困难。对于后者,希望你们不要放弃,因为这一节的内容是本篇文章的最后一节了,也是最轻松的一节。
学习完上面的内容,肯定会有同学会问:上面的所有内容都是编译器里事先写好的,那么怎么输入数据呢?
C++中多使用标准输入流cin进行数据的输入。与标准输出流cout相反,cin使用 >> 作为输入流运算符。
下面是一个简单的举例,请大家自己测试并理解这段代码。
通过这段代码,大家很容易掌握这个知识点。
#include<iostream> using namespace std; int main() { cout << "她叫什么呢?" << endl; string name; cin >> name; system("cls"); cout << "我想写下她的名字......" << endl; cout << "是啊,这是对过去的告别,也是对未来的告别..." << endl; cout << "我终将继续走下去的...是的,一个人" << endl; cout << "那么,再见吧," << name << "..." << endl; system("pause"); return 0; }Tips:下面的这行代码执行时产生清屏的效果。
system("cls");
另外,我们希望读者注意以下的内容:
cin可以连续从键盘读取想要的数据,以空格、Tab或换行作为分隔符。
例如,下面的两种输入时完全相同的:
123 456 a = 123 b = 456 123 456 a = 123 b = 456因此,我们完全可以借助 << 和 >> 两种运算符完成大多数数据的连续输入输出。
cin >> a >> b; cout << a << b <<endl;标准输入/输出流有没有其限制所在?当然有,不过现在我们没有必要接触。
祝贺大家,我们已经完成了迈出了C++编程的第一步!
在上面的学习中,我们不仅创建出了自己的第一个新项目,写出并调试了自己的第一个C++程序,还学习了C++中的输出/输入方式、注释方法、数据类型和有趣而实用的sizeof函数。可以说,大家在C++的初学阶段已经学到了不少了!
如果说,你作为一位从未接触过编程语言的小萌新,仅仅用了一个晚上就完成了上述知识的学习,那么,Congratulations!
如果你理解上仍然比较困难,也不要难过。每个人在学习过程中都会遇到困难,在未来的编程学习中可能遇到的困难可比你今天遇到的多多了,小小的思维卡壳又有什么?
对于不能很好理解本篇笔记中的内容的童鞋,这并没有什么关系。但我希望大家能够至少理解下面这句话:
只要脑子一直想,一直想,你就可以干这个地球上所有的事情。
——《银河补习班》
那么,本篇笔记到这里就要结束了。我们下篇笔记再见!
