共计 5579 个字符,预计需要花费 14 分钟才能阅读完成。
什么是 C ++?
C++,同广为人知的 Python、Java、C 等一样,是一种 编程语言 ,并且是 编译型 的。
什么是编译型语言?
编译型语言 ,如C、C++,顾名思义,就是 需要编译 后才能够运行的编程语言吗,与之相对的是 解释型语言 ,如Python、Java,就是 不需要编译就能运行 的编程语言。
通常来说,编译型语言 的运行速度比 解释性语言 快得多,为什么呢?
因为计算机能够看懂的只有 二进制指令 (在各个系统中,通常被称为 可执行文件 ),编译型语言是 将你的程序一次性全部翻译成二进制指令 ,而解释性语言则是 程序执行到哪里翻译哪一行,效率更低一些。
当然,这并不是我们的重点,我想要说的是,写 C ++ 代码一定要 编译!编译!编译!,切记不要傻傻地去执行一个 修改过了却没有编译的程序 ,因为你将会执行你程序 上一个版本 的编译出来的 可执行文件,就会出现一个奇特的心理状况:
我明明改过这里了呀?为什么执行起来和原来一样啊?
所以另一个方面上来讲,当你有这样的疑惑时,去看看自己是不是忘记编译了。
如何使用 C ++?
C++ 的 Hello World
某个编程语言的 ”Hello World”,指的是 使用这个编程语言输出 ”Hello World”,在 C ++ 里,这并不是一件简单的事情 ,因为Python 只有:
print("Hello World")
而 C ++ 嘛……
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << "Hello World";
return 0;
}
多了这么多!
凭什么?为什么?不可思议!Unbelievable!Incredible!
这代码都干了些什么?
先分析一波,第一行 代码:#include <bits/stdc++.h>
,英文直接翻译:包含 <bits/stdc++.h> 这个文件?
,所以说……这是在 引用头文件?
头文件是啥?
当我们要写一个程序,肯定 不能直接写二进制代码 ,但是如果要使用一些功能,我们又不得不去看 针对于某个操作系统的程序开发教程(来自官方),需要写一堆代码!怎么办呢?所以说,这些工作 已经有人帮我们做好了 ,换句话说,叫 不用重复造轮子
, 直接使用别人预先帮我们写好的各种功能 就行了。
如何声明头文件?
声明头文件,首先要知道 有什么头文件 ,C++ 里的头文件根据不同的功能,有 很多 个,如:iostream
、vector
、stack
,这时候不经就要问了,这么多头文件?他们分别是干啥的?我 记不住 怎么办?(这个才是重点(bushi))
别担心,伟大的先人们 已经帮我们提前搞定了 ,这时候,就要请出 万能头文件:
bits/stdc++.h
这个头文件里,把我们写程序几乎所有要用的头文件都整合到了一起,所以说,原先可能有好几行的头文件引用,现在只要:
#include <bits/stdc++.h>
到这里,应该也可以看出 C++ 引用头文件 的语法了:#include < 头文件名称 >
。
然而,不得不提的是 ,万能头文件虽然 很方便 ,但是由于承载的 函数太多 ,就会导致有一些你 不能使用的变量名 (因为已经在头文件里被定义成 功能函数 或是别的什么了,这时后你再去定义,编译器就会抛出一个 重复定义 的错误),所以说当你发现 莫名其妙的变量或函数重定义或者命名错误时,换个变量或函数的名称试试。
这个 Using namespace std;
是啥?
分析完了头文件,我们来看 第二行代码:
using namespace std;
看起来毫无头绪呢……
那就先分析 分号 (;
),C++ 的语法 要求我们在非头文件和宏定义的语句后面加上分号 , 表示代码指令的分割。
举个栗子:

#
开头的不需要加 ;
:如#include <bits/stdc++.h>
、#define int long long
这些,后面都没有分号。
非 #
开头的一般要加;
:如:using namespace std;
、cout << "Hello World";
当然,也有特殊情况 :像是 定义函数不用加 ;
(编程里的函数和数学里的函数 很像 ,但不仅可以进行运算, 还可以干一些其他的事情 , 不过这是后话 ),其余的 暂时不提 ,总之只要有这样的一套 完整的概念 就行了。
一个 小 Tip,其实,你甚至可以在需要分号的地方不换行,比如:
int a = 1;
int b = 1;
可以写成:
int a = 1; int b = 1;
编译器也是不会报错哒~
所以这到底是啥?
其实,这个和头文件 相辅相成 ,因为功能函数多了就肯定要 分类 呀,所以 C ++ 里要调用一个输出的函数,就需要先写它的分类,也就是说,要写成 std::cout << "Hello World";
,很烦是不是?那么using namespace std;
就派上用场了 ,这个意思就是把std
这个分类下的所有功能函数直接移到 根分类 下面,就可以不写分类名称,直接调用。
具体就是:
没写using namespae std;
:
* 根分类
|- std
| |- cout
| |…
|…
写了using namespace std;
* 根分类
|- cout
|- std
| |- cout
| |…
|…
好啦,搞定!
主函数是啥?
现在我们来到了 第三行代码(块):
int main() { ...}
(右大括号 出现在代码的 最后一行)
不难发现,C++ 程序 里的 {}
不仅 有特殊意义 ,还是必须 成对出现 的。具体有什么意义?简单点说,在 大括号内 的代码可以 看做一个整体 , 在一个特定条件满足的前提下 ,这一块代码块 才会被执行。
那么反推一下,意思是:不写在代码块里的东西,不用特定条件(触发),就会被直接执行? 是这样没错。
让我们来讲讲函数
前面说过,在头文件里,有各种各样 提前准备好了的功能 ;前面亦说过,C++ 的函数 和数学的函数很像,又比数学的函数强大。
提到函数,有一个东西 不得不讲。
C++ 的数据类型
数据类型,在数学里 十分常见 ,如: 整数
、 小数
、 分数
、 负数
、 正数
、 有理数
……
在编程中,先人们为了 达到更高的运算效率 ,并且为了 便于区分 ,要求我们在定义一个变量(在 数学
中,我们称其为 未知数 ;在 科学
中,变量 意为 会改变的量 ,与 常量 相对。)的时候,要先告诉电脑这是一个 什么类型的变量 ,用专业( 装)一点的话来说,叫做 声明变量类型
,那这里的 类型 和数学里的各种类型 一样吗?
有点区别。
C++ 中,我们最常见的就是 数字 ,但是计算机里保存 一个超大大数字 还要 进行计算 可不是什么简单的事情 ,因为计算机的存储也是有 单位 的,超多单位 要协同就会 非常困难 ,而且,编写电脑 操作系统的家伙们 还规定了一套 管理内存 的法则,如果我们在程序里不规定数字范围,都按照 超大 来跟 操作系统申请内存 的话,就会出现:
“喂!我这边又多了 三个整数变量!还是老样子!给我按最大的整啊!”
“可是程序老爷,那边的内存管理小姐来报告说 内存都装不下 了……您看……要不……”
“不行!这个东西必须要!不然我这边就会 出错 的。”
“可……”
“没什么可是的,快去给我办!”
“哦……好……”
(另一边)
“啊?操作系统小姐,您的意思是说……还要来我这里申请 20M 内存?您难道没看到 这里都满了吗?”
“这是那边要的……我这不是没有什么办法嘛……”(声音 小小 的)
“行了行了,就知道你 不靠谱,那就试试那个吧,不行的话……他们也就死心了。”
于是就……

这个故事告诉我们,数据类型 的管理和范围的限定 非常重要。
为了避免这个情况,我们有了:
群魔乱舞的数据类型
C++ 里,最常见 的数据类型就是 int
了。int
的范围是 -2147483648 ~ 2147483647
,记不住?没关系!我也记不住 ,这时候,就要用到 先人 的智慧啦~ 祭出法宝:
INT_MIN
和INT_MAX
!
分别是 最小 ,和 最大
这是 C ++ 的 climits
头文件里的一个 常量 (虽然你也可以改变它就是了),当然,这个头文件已经被包含在bits/stdc++.h
里了(先人真伟大)。
那么 int
类型就这么点范围,我如果要存一个更大的数怎么办?我也不讲什么 long int
了,直接上最长的 long long
,它的范围常量:
LONG_LONG_MIN
和LONG_LONG_MAX
那么我们 该用哪种?
要 依据情况 而定,一般来说,开 int
类型的变量 已经足够 ,但要留意下题目给的 数据范围 有没有超过 int
的数据范围,还有中间的计算过程也可能会 超出范围,所以,如果不够的话,就开 long long
。
为什么不都开long long
?
你是想开几亿个 long long,然后让内存小姐 full of workssssss?还是想让存储格 直接坏掉 啊?啊?回答我!
咳咳,以上的发言 来自内存小姐,不来自作者本人哈。
如何声明和使用变量?
和 数学 一样,数学的定义变量是这样的:$$x \epsilon Z$$,到 C++
里:int x;
,或者 long long x;
,不难发现,C++ 定义变量的语法是 变量类型 变量名称;
,简单!。
使用就更加简单了,数学里:
$$x=1$$
C++ 里:
x = 1;
就多了个 分号!
这是 赋值 ,那么 运算 呢?
数学里:
$$x=x+1$$
C++ 里:
x = x + 1;
这么 简单 ?其实,像加一这样的小操作还可以写成:x += 1;
或者 x++;
简单解释一下,变量名 运算符 + 等号 数字
,这个语句 等同 于变量名 = 变量名 运算符 数字
, 特殊的 ,如果是 加减一 这样的操作,直接:x++
或者 x--
就行。
值得注意的是,x + 1
会返回 x + 1 的值,就是先取出变量 x,再给你 这个值 +1 所得到的结果(并不会改变 x
),而x = x + 1
就是再这个基础上,把这个结果 重新赋值 给x
,明白了吗?
值得一提的是,赋值操作 也会返回 一个值,这个值就是 x 被赋值之后的值 ,也就是说,当你有两个变量,想 快速赋值 的时候,别人的代码:x = 1; y = 1
,你的代码:x = y = 1
。
也就是说,y = 1
返回了 y
的值,也就是 1
,而这个值被x =
接收 到,所以 x
也被赋值为1
。
咳咳,好啦变量和数据类型就 到此为止。
函数的定义
C++ 的 函数定义 ,和变量的定义 极为相似 ,只不过,变量的值是一个 常数或者别的什么东西 ,而函数呢?它则可以 运行一串代码 ,然后根据代码来 返回结果。
不过,这不是本期的内容,我就只讲一个 特殊的函数——主函数。
主函数(Main Function),也就是我们的 int main() { ...}
,我们已经可以解释 一些东西了 ,函数和变量一样,也要规定它的 返回值的数据类型 ,我们发现,主函数的返回值是 int
,这被称为程序的 结束代码 。用于判断程序终止的 正不正常。
“哎!操作系统小姐!我结束了啊!退出码是 0”
“嗯,(๑‾ ꇴ ‾๑)好哒~ 我知道啦~ 辛苦啦。”
“操作系统小姐!这边的退出码是 -33433121呢……”
“看起来 没有正常结束 ,反馈给 用户 看看吧。”

是不是很银杏话捏?
那么我们的函数该 怎么返回一个值?,答案是:翻译一下! 返回的英文:return
,所以返回 0
这个数就是:return 0;
,也就是代码的 倒数第二行!
归类一下,所以 C++ 的 函数声明 就是:返回值类型 函数名 {函数被调用时执行的代码}
。
那么主函数的 独特之处 就在于它会在程序开始执行时就被 调用一次 ,不过在它 被调用之前 ,会先执行函数外面的代码。不过,C++ 规定,除了 个别的语句 (如 定义变量 / 函数
、 引用头文件
、 提取分类到根分类
……),其他的 都不能 直接写在主函数或者其他函数的 外面。
如何输出捏?
前面已经说过了,头文件中有各式各样 已经提前写好的功能 ,这其实也就是提前定义了 超~ 大~ 一堆函数 供我们来使用。
如何使用函数?
最简单的就是这样:printf();
是的!后面加括号 (别忘了 分号)就行了!是不是很简单?来看看我们的 Hello World
:
cout << "Hello World";
丝……
看来有个别函数 不是这么用的 ,不过问题不大,就目前来看, 我所接触到的函数里 , 只有 cin 和 cout不是这样用的,其余的都可以这样用:函数名(参数 1, 参数 2, ...);
具体的,下一节来讲。
一个新的数据类型!
"Hello World"
,这是什么?""
这又是什么?这就是一种 新的数据类型 ,,叫做 字符串 。 字符串 ,就是 “字符” 组成的 “串”,那么 字符是什么?
字符,就是像 a
、b
、A
、 中
、,
等字符,包括了 字(文字
)和 符(符号
),不过是 单个的 ,值得一提的是,1
也可以是一个 字符 ,当它被 定义 成这样:'1'
时,就是了。
字符定义时,是在字符的两边加上 单引号 ,并且在 C 中,字符这一类型被命名为 char,那么定义一个字符 a 为 a
,就是:char a = 'a';
(C 是允许在定义变量时就赋值的哦)。
那么 刨根问底 ,字符是怎么 存储的 ?计算机不是只能 存数字 吗?这就要请出:Ascii 码表

它定义了 一套用于把字符与数字互相转换的规则 ,使得计算机可以 存储字符 ,也就是说,你可以像操作数字那样 操作字符
比如:char a = '/' + 1;
,我们发现,/
的 Ascii 码
是47,加一就是 48,所对应的就是字符0
的 Ascii 码!
那么我该如何把 字符 0
转化成 数字 0
呢?简单!char a='0'; int b=a-'0';
这个时候,b 这个变量里存的就是 数字0
,厉不厉害?
说回字符串
字符串,就是 把多个字符串在一起 ,使用 双引号 来表示,数据类型名称为:string
。如:string a = "Hello World";
,但是 注意 ,字符串 不能像字符一样直接进行数学运算 ,而且当一个 字符串和一个字符做比较判断时 , 结果总是 false(假)。
回到 cout
cout,就是 输出函数 ,它的用法是:cout << 输出内容;
,也可以:cout << 输出内容 1 << 输出内容 2 << ...;
,但是这样的 cout 只会 暴力把东西拼在一起,比如:
cout << "Hello" << "World"
这段代码的结果是 HelloWorld
,没有 空格 ,也没有 换行,要注意。
那么如何换行?endl
来也!
cout << "Hello" << endl << "World";
当然,你也可以写 多个 cout。
cout << "Hello" << endl;
cout << "World";
这两个的结果都是:
Hello
World
现在你 明白 Hello World了吧?
结语
代码到这里 就讲完了 ,有什么问题欢迎随时来提,下一次,我们讲 基础运算符~