第一章 基本概念

前言

这一章或许会比较枯燥,想直接实际操作C++编码的可以直接跳过。此文章有许多个人心得,非原则性的说法见谅,如有常识性的错误,欢迎提出。

1.计算机与二进制

众所周知,计算机和数学密切相关,属于一门科学。如物理、生物和化学一样,通过逻辑定义来解释世间的事物。就说物体的运动规律吧,前有亚里士多德提出“力是物体运动的原因”,后有牛顿提出“力是改变物体运动的原因”,再有爱因斯坦说“世界不存在力,质量造成时空弯曲,从而形成了物体的运动轨迹”。所以计算机实际是一种,以二进制为基础形成的逻辑方式。计算机所显示的图像、音频、文本,皆是由二进制所表示;数据通过电线传输通过电信号的高低形成了二进制序列;数据在硬盘上存储也是通过改变磁碟的磁性来实现的,最终识别磁性转化为二进制序列。所以对计算机和二进制的理解,是非常重要的,或许在C语言老师讲的时候并不会认识到这一点是多么的基础和重要。

所谓进制就是表示数字的方法,满几进一位。比如常用的十进制,也就日常生活用到的,0-9来表示数字,如果人有12个手指,或者能够很方便的使用脚趾,可能现在使用的就是12进制或者20进制。计算机的基础是二进制,也就是只有0和1两个数字。之所以采用二进制,是由于电路便于识别高低电平,半导体的硬件特性可以组合形成逻辑运算。比如代码中的逻辑与、逻辑或、逻辑非运算,在电路中可以用晶体管组合形成,玩过《我的世界》的同学应该知道在游戏里面可以通过红石电路实现简单的数值计算。现在的CPU集成的晶体管数量已经在100亿的数量级了,所以额外说一句,在代码中纠结一个加法和乘法的效率区别,对于新手来说是没有必要的,反而是错误的。

下面来计算一下几个常用的值,1位二进制可以表示0或1,也就是1位二进制可以表示2个值。如果我们要表示2这个数字,就必须进一位,用两位二进制表示,也就是10。所以表示3的二进制为11,表示4的二进制为100。那么不难得出二进制位数和可表示值的数量关系:

其中N为可表示值的范围,n为二进制的位数。那么8位二进制可表示的值数量为2的8次方,也就是256。由于0占一个位置,所以8位二进制表示从0开始的数字,就可以表示[0,255]。如果用一半表示负数那么就是[-128,127],当然以上只是常用的表示范围,要是自己想的话也可以表示[1,256]或者[10000,10255],反正只能区分256个值而已(注意这里中括号表示的是闭区间,如果是开区间则用小括号表示,和数学上的概念一致)。

8位二进制就称为一个字节,关于数字和类型的大小后面的章节再详细介绍。

2.编译原理和图灵机

当老师讲到编译原理的时候,编译器经过了N个阶段,最终才生成了可执行程序,这个时候我们已经迫不及待了,对程序编译的过程毫不感兴趣,实际上这一阶段也需要理解一下。

我们所键入的C++代码是我们能够看懂的(或许久了也看不懂了),而计算机只能识别二进制,所以编译器即是一个将高级语言(C++)的代码按一定规则,转化为机器可识别的机器码的工具。也就是高级语言->汇编语言->机器语言的过程。幸好编译器帮我们实现了这些功能,不然学编程必然是门槛极高的一件事。可是现在由于底层堆叠的层数太多,导致码农丛生,这也就不奇怪了。不理解计算机的原理,不接触C语言,我觉得应该难以成为高手,当然除了只是简单利用编程进行一些计算和研究的人,没有必要研究那么透彻。再底层一些的工作也就是接触汇编与操作系统,做CPU相关的研发。不过国内的发展顺序和国外恰好相反了,一开始的计算机通过卡片打孔来输入数据,也就是机器语言,后面为了方便人理解和编写,就有了汇编语言。最初的操作系统也由汇编语言写成,而汇编语言不够结构化,才有了高级语言。由于程序规模越来越大,也就有了更多的框架与结构,比如C++,以面向对象编程思想和方法进行开发。而脚本(虚拟机)语言为更上一层的事物,它并不直接编译成机器语言,而是直接调用已编译好的机器码,比如Java与C#。

但是万变不离其宗,所有在计算机上执行的程序都是一层一层向下调用,最后通过二进制的逻辑运算,CPU等硬件的处理,最终依赖了真实世界的法则。

图灵和冯诺依曼被称为计算机之父,图灵提出的图灵机就像现代计算机理论上的执行方式。程序像一条长纸带,纸带上记录了符号,机器通过读取当前纸带位置的符号来做运算将结果记录到纸带上,并且移动纸带到特定位置。而冯诺依曼计算机则是图灵机的工程化实现,构成了现代计算机的核心理论。其实你只要用心想一想,自己面对的显示器、手机所呈现的内容,到底是如何由一些芯片电路驱动的,就会觉得计算机实际上是一种理论与实践的结合,软件只不过是硬件上的抽象理论,而硬件才实现了软件所需的功能。就像汽车华丽的外表掩盖了内部的机器运作,如果要研究如何制造汽车,光关注于软件层面的理论,那是万万不得行的,所以学习编程语言当然也需要稍微理解背后的原理。至于开发国产CPU,实现操作系统,发明一门编程语言,实现计算机硬件一整套的生产,这些事情就需要天才的您来完成了,我的能力有限。

3.层级结构

层级结构是非常常用的计算机结构,无论是硬件与软件,层次都很明显。就像堆积木一样,从最底层的内容不断积累才形成了现在的计算机体系。就说硬件层面上的数据保存吧,最基本的是硬盘->内存->CPU,由于数据最终需要通过CPU处理,硬盘和内存的二进制数据就需要想办法传输给CPU,由于(机械)硬盘通过磁盘保存数据,读取数据需要硬盘里的磁头高速旋转来读取数据,所以等硬盘的数据传递给CPU就太慢了。内存作为主要的数据缓存,以不同的硬件实现来保存数据,并且可以快速的传递给CPU,当然缺点就是容量更小,且断电不能保存。而CPU实际还带有高速缓存,也就是CPU之内的“内存”,速度更比内存快,但容量也更小。CPU的高速缓存一般分3级,最常用的数据放置到一级缓存,这样就能最快的读取。如果放不下就只能往后排,最后就只能放到内存。内存如果也放不下,程序的编写者就需要动态的加载数据到内存,当然用时从硬盘加载到内存就会很慢了。这也是为什么有些游戏需要加载时间,下面举例:

小明点开一个程序,这时程序(就像一张纸条)从硬盘读取到内存,再从初始位置执行,通过CPU的运算,改变处理的位置,并改变程序在内存中的数据。这样就是程序执行的基本过程。当然这只是大概的逻辑,其中细节就太多了。每一个细节都被无数程序员研究过,所以咱们就不研究那么细节了。

当然上面的层次还可以附加,比如大家所说的“云计算”、“云游戏”。其实原理就是数据通过网络保存在其他电脑上,或者通过其他电脑处理数据,自己只输入数据和接收结果。而“分布计算”是通过网络连通许多的电脑来一起计算。

通过网络用其他电脑保存数据,就可以代替硬盘的作用,当然就可以视做硬盘之下的一个层次。

软件上的层次也很明显,如第二节所说的,最基本的是机器识别的机器语言,然后是汇编语言,然后是高级语言。而软件开发时,操作系统提供了API接口隐藏了与硬件的交互,让一般的程序员不需要和硬件打交道。再之上有通用的类库,比如解析png、jpg格式的图像库,使用字体的freetype库,3D开发的DirectX库,这些可以算一个层次。再之上就是游戏引擎、UI界面库等。有些游戏提供mod功能,也如同微信小程序,是在应用之上提供的开发功能,也可以算一个层次。这些就像一整条产业链,作为个人很难每一个都精通,当然也很难撼动现有的体系。要从头做起,也是不太可能的事情。

4.计量单位

咱们终于可以说一些比较客观的东西了,一些有固定定义的内容~

首先1位二进制,这个叫1位,如同一个开关可以表示两个状态,也可以叫做1bit。

8位叫做1个字节,也就是1byte。而我们经常看到的KB单位,即是kilobyte(千字节)。但是在程序员眼里1024才是整数,所以实际上1KB = 1024byte。

所以:

除了字节的常用说法外,还有字的说法,也就是WORD,这个实际是两个字节。DWORD是Double WORD的缩写,所以实际是4个字节。现在常用DWORD表示颜色,在各种颜色代码里我们可以看到0xffff0000或者#afafaf之类的写法,实际这就是占4个字节的十六进制数字。

5.C++是什么

C++如同数学一般,是定义的一套规则。至于编译器如何编译是编译器的事情,与C++无关。你只需要按照我规定的语法行事即可。所以C++是跨平台的,无论什么操作系统都可以使用,不过这个也要看你如何使用,如果在Windows平台使用VS编译器,并且使用WindowsSDK提供的API,那么就是依赖了平台。不过依赖平台是必须的操作,就像你在中国混就得按中国的规矩来。一般的做法是为不同的操作系统写不同的代码,不依赖操作系统的代码就可以不变。

C++的前身是C语言,C语言由贝尔实验室于1972年研发出来。最开始C++名字叫c with class,也即是带类的C语言。所以C++基本是兼容C语言的,不过却多了很多语法。而且C++的标准(也就是语法规则)在不断的更新,最新的是C++ 20版本,不过对于新手来说可以不用关心这些。

在2010年的时候我在新华文轩买了我的第一本C++书,不过接下来好几年都没看明白,直到高三的时候有了些感觉。为何我要选择学C++呢,因为我看到网上说C++比较适合做游戏,于是就入了坑。现在我认为C++确实是游戏行业的不二选择(或许国内不是),C++也比较适合大型软件的开发,最重要的原因是我认为如果不会C语言,就不太可能成为高手,不会面向对象也难以跟上时代。虽然Java、C#和许多脚本语言比C++简单很多,也能够开发很多有用的软件。但是吧,要深入研究计算机编程,学C++应该是比较好的。

结语

本章大概说了一些基本常识,如果不太理解应该是很正常的,很多词汇我并没有具体解释,一下子就会犯迷糊。不要由此失去了学C++的信心,这只是一个大概的论述。

【C++教程】01.基本概念相关推荐

  1. HTML/CSS学习笔记01【概念介绍、基本标签】

    w3cschool菜鸟教程.CHM(腾讯微云):https://share.weiyun.com/c1FaX6ZD HTML/CSS学习笔记01[概念介绍.基本标签.表单标签][day01] HTML ...

  2. H2O Wave教程---基于浏览器的实时显示工具---教程01

    H2O Wave教程-基于浏览器的实时显示工具-教程01 0 写在前面 1 开始-动手操作起来 2 分类:一个是脚本,一个是app 3 脚本怎么写 0 写在前面 总结一下自己学习H2Owave的学习情 ...

  3. (转)OpenLayers3基础教程——OL3基本概念

    http://blog.csdn.net/gisshixisheng/article/details/46756275 OpenLayers3基础教程--OL3基本概念 从本节开始,我会陆陆续续的更新 ...

  4. 增值翻译系列谈(01)——概念界定和辨析

    增值翻译系列谈(01)--概念界定和辨析 高巍(w-gao@263.net) 1 译者的主要责任是什么? 答:译者的主要责任并不是"译"好某些文字,而是为了委托者(即客户)的最大利 ...

  5. 物联网平台搭建教程01

    物联网平台搭建教程01 1 物联网设备如何接入到网络? 2 网络通信方式 3 物联网设备之间,设备与云平台能够交换数据后,接下来要干怎么呢? 4 如何搭建起一个物联网系统框架呢?它的技术架构又是怎么样 ...

  6. React 全家桶入门教程 01

    React 全家桶入门教程 01 前面是基础课程(难度小,略过),后面是案例 目的 巩固react基础知识,查漏补缺(熟悉的部分快进) 学习相关的库的使用 https://study.163.com/ ...

  7. Python tkinter教程-01:创建窗口

    Python tkinter教程-01:创建窗口 文章目录 0 准备工作 1 创建空白窗体 2 窗口标题 3 窗口大小与位置 4 锁定窗口大小 5 窗口图标 6 隐藏与显示窗口 其它 0 准备工作 要 ...

  8. React从入门到精通教程01

    React从入门到精通教程 React从入门到精通教程 React简介 官方文档 React使用来干什么的 为什么需要React React特点 React基础 React的使用 Hello Worl ...

  9. 环信WebIM 超详细教程01:点对点单聊

    环信WebIM 超详细教程01:点对点单聊 第一个单聊(点对点)Demo 前言 一,准备工作:注册->登录->创建应用->创建应用用户 二,搭建工程,实现简单的单聊(点对点)功能 三 ...

  10. AI作曲基础-Python编程作曲软件篇-FoxDot文档及源码分析-官方教程01

    AI作曲基础-Python编程作曲软件篇-FoxDot文档及源码分析-官方教程01 前言 本系列系列目录放在文尾: 本系列是AI作曲的基础,暂时和AI关系不大,但尤为重要: 借助FoxDot,从文档分 ...

最新文章

  1. DNN和IBatis.Net几乎同时发布新版本
  2. Google学术分析公司科研实力:谷歌1161,华为110,为何差10倍?
  3. C++下简单的socket编程
  4. 深度学习基础系列(八)| 偏差和方差
  5. Nginx独立图片服务器搭建教程
  6. 中国哪里的地铁最拥挤
  7. 【数据可视化应用】绘制风玫瑰图(附Python代码)
  8. DMS/BSD/ADAS
  9. CSS( Cascading Style Sheets )简书
  10. 来我家玩吧服务器维护中,为什么来我家玩吧登录不了,来我家玩吧进不去怎么回事...
  11. 彻底删除EFI启动项
  12. vue页面实现短信验证码60秒倒计时
  13. Android中处理大图片时图片压缩
  14. c语言程序编写字体,c语言程序设计练习题
  15. anaconda初体验
  16. @Validated使用
  17. 启信宝牵手国家队,征信服务进化再加速
  18. 刷leetcode习题
  19. YunOS切入智能家居 欲将人、物、服务三网合一
  20. Datawhale 10月学习-Free excel 学习笔记--excel函数3--FILTER,SUMIF,SUBTOTAL

热门文章

  1. 10你当前无权访问该文件夹_「文件保密小技巧」教你创建一个别人打不开也无法删除的文件夹...
  2. 四十八、面试前,必须搞懂Java中的线程池(下篇)
  3. 岗位内推 | 美团语音交互部招聘NLP/知识图谱/语音识别等算法职位(可实习)...
  4. 搜出来的文本:从MCMC到模拟退火
  5. 当我们谈论「Chatbot」时,我们在读什么? | 论文集精选 #05
  6. python3 音乐播放器_python3 音乐播放器
  7. python怎么批量处理数据的优点_Python数据处理干货,一文带你深入理解pandas的批量处理方式...
  8. 安卓点击图片跳转界面_安卓手机APP控制无线开关的电路方案设计(原理图+源码)...
  9. 游戏里的角色都什么格式图片_二十年前是怎样开发游戏的?
  10. 呕心沥血为小白总结13个学习网站-错过了你注定绕弯!