当前位置: 首页 > news >正文

在域名做网站万能搜索 引擎

在域名做网站,万能搜索 引擎,网站建设的卖点,石狮交通和建设局网站四、基本概念 这部分和C语言重复的部分就简写速过#xff0c;因为我之前写过一个C语言的系列#xff0c;非常详细。C和C这些都是一样的#xff0c;所以这里不再一遍遍重复码字了。感兴趣的同学可以翻看我之前的C语言系列文章。 1、数据类型 编程的本质就是操作数据。 操…四、基本概念 这部分和C语言重复的部分就简写速过因为我之前写过一个C语言的系列非常详细。C和C这些都是一样的所以这里不再一遍遍重复码字了。感兴趣的同学可以翻看我之前的C语言系列文章。   1、数据类型 编程的本质就是操作数据。 操作数据就是读数据、进行计算、写数据其中读和写必然要牵扯到数据的存储。 数据的存储就必须要有数据的名字变量名、数据的内容变量值、数据的类型(变量类型)。 名字和值好理解那为啥要类型呢类型表示给这个变量一个多大的空间去存储它比如一个字母a就给1个字节(8bit)就可以了多了就是浪费一个整数一般给4个字节就是32位当然你还可以规定比如第一个位表示符号位这样就是可以表示正整数和负整数了那剩下的31位就能最大存一个2的31次方这个数字当然如果你存了31个0那就是0了如果你存了31个1那就是数字2的31次方了。也所以不是你想存多大就能存多大的数字超过2的31次方就会发生溢出也就是你存的数字并不是你想存的数字了。 所以数据类型就是指这个数据存放空间的大小。不同的数据类型意味着占用不同大小的内存空间。 下图是基本的数据类型 说明 (1)数据首先是分为常量和变量。在程序运行的过程中其值不能被改变的叫常量。可以改变的叫变量入上图F。 常量我们用宏定义上图A宏URL就表示字符串“hello world”。上图中BCDE都是变量。 2不管是常量还是变量对计算机来说最重要的是地址和类型所谓的变量名其实是给程序员看的。计算机只要知道这个数据的首地址和占用内存的大小即可它不需要知道这个数据的名称。数据名称只是程序员写的代码和编译器之间的沟通信号。编译器和代码用变量名沟通完毕后编译器再和cpu传话时用的就是这个数据的首地址和占用空间了。 3如果是整数变量你可以定义变量的类型为intshortlonglong long这4种类型之一。其中int类型占用4个字节short类型占2个字节long类型占4个字节long long 类型占8个字节。占用字节的大小决定着你这个数字在内存中的存储空间的大小也就是决定着你存储的数字的上下限。unsigned表示是否有符号位。 同理其他数据类型。 4不同的数据类型给分配多大的内存一般是取决于编译器不同类型编译器之间会有差异一般情况下不会相差太大。 5bool类型不是取1就是取0是不是1个比特位就够用了为啥给分一个字节的空间呢因为我们寻址内存的是是按照字节寻找的找不到位的哈。 6除了上面展示的数据类型你也可以创建自定义数据类型但你自定义的类型都是在这些基本类型之上创建的。 7数据转化为指针或引用。指针通过一个*号来声明引用用表示。说来话长这些以后要专门聊。 2、函数 函数就是我们写的代码块被设计用来执行特定的任务。 如果函数被放到类里面了就叫做方法了。所以这里我们讲的是函数不是方法。 为啥要函数避免重复写相同的代码。你就理解为把某项特定的功能封装起来。你啥时候想用这个功能了你调用这个函数就可以了。下面用例子展示左图所示我写了3个函数A、B、C。函数A的名字是Multiply名字前面的int表示函数的返回值的类型是整型名字后面的括号里是参数。这个函数有两个参数a和b参数a和b的类型都是int类型。函数B的名字是func,这个函数只是要实现在屏幕上打印一个4x2的结果所以也不需要什么参数所以小括号里面啥参数也不用写。又因为这个函数也不返回啥所以函数名前面的返回值类型是void,void就是啥也没有的意思。函数C就是我们常说的main函数是一个程序的入口函数因为不需要传入任何参数所以后面小括号里面啥也不用写又因为其返回值是0所以main前面是int。 左图的Multiply函数就是一个“实现两个数相乘计算出结果”这个功能的函数。我们在C函数体内调用了3次Multiply函数。但是有没有发现在main函数里写了3遍cout是不是很麻烦。所以右图我们再写一个MutiplyAndLog函数把A和B的功能都包含进来是不是右图的main函数就简洁了很多对这就是函数的封装打包就是为了避免重复写代码 函数有声明和定义。声明通常存储在头文件中我们在翻译单元或cpp文件中编写定义 函数很重要每个程序都是由一系列函数组成的。所以这里简单过一下函数调用过程中的堆栈 堆Heap与栈Stack是开发人员必须面对的两个概念不同场景下堆与栈代表不同的含义。一般情况下有两层含义 1程序内存布局场景下堆与栈表示两种内存管理方式 2数据结构场景下堆与栈表示两种常用的数据结构。 这里的堆栈通常称为调用栈或执行栈是由操作系统和编译器共同管理的一种数据结构用于存储函数调用的上下文信息。下面展示一个函数调用的粒子 可见一个程序的运行一般是在内存中跳来跳去执行函数的。函数的prologue、epilogue是自动由编译器生成的它的具体实现细节可能因编程语言、编译器、目标架构和调用约定的不同而有所变化。例如在x86架构的C语言中函数prologue和函数 epilogue 的典型汇编代码可能如下 3、头文件 头文件通常用于声明一些函数。头文件中有很多函数声明使我们在多个.cpp文件中使用。头文件就是我们声明函数的一个公共地方。 如上图所示如果每个.cpp文件用到的函数都得声明一下就非常麻烦所以我们所有的函数的声明都放到.h文件中然后在.cpp中include这个头文件当预编译时就相当于是声明了。 A这条语句的意思是只声明一次。当我们有多个头文件时很难保证多个头文件中的声明函数没有重复的当我们把多个头文件都include到.cpp文件中时就会出现重复声明就会报错pragma once可以避免多次声明。 B有的有头文件有后缀.h有的头文件没有后缀这是因为C标准库和C标准库的区分。C标准库的头文件文件名都没有扩展名以此和C标准库进行区分。 Cinclude头文件时有的用尖括号有的用双引号是因为尖括号只用于编译器包含的默认路径而如果你使用引号那就自由很多你可以写任意的你的相对路径。 4、断点调试 如果你的代码有语法错误那编译时就会报错你按照报错信息调试代码即可。但是如果你的代码能顺利运行但就是运行结果非你所想、或者运行过程中系统崩溃等现象这些你就没法通过报错信息调试了此时很重要的调试方法就是打断点-读取内存信息去分析为啥运行过程中没有按照你的预期执行。 设置断点是为了读取内存。断点就是暂停的意思程序执行到断点处就会挂起执行线程此时程序的状态就是你内存的状态。此时你查看内存视图诊断你程序出问题的原因。 (1)如何进入断点调试模式 2内存查看的基本操作 以上就是打断点读取内存的方法。断点调试的内容很深很深这里只是入门展示一下。 5、输入输出 1C与C的输入输出方式对比 输入输出是人机交互的最直接方式我们以后会经常用到。为了防止有些学过C的同学混淆我们先区分一下C与C的输入和输出。 我们先看输入 C用的函数是scanf()我这里用scanf_s是因为我用的是C编译的会报这个函数更新了让我用scanf_s替代这没关系。 我们看scanf_s函数函数第一个参数它是一个包含占位符的字符串后面的参数是这些占位符的地址是取址符。 函数的返回值是成功赋值的数据个数。 说明当程序执行到scanf_s时程序就停止在控制台等待用户输入。用户一定要按照A数字B数字C数字的方式输入也就是第一个参数规定的格式。当然如果你第一个参数没有规定格式那scanf就默认是用回车分隔abc三个变量的。 C用的是cin是iostream类的一个实例程序运行到B2时也是会停止在控制台等待用户输入默认用回车分隔用户的输入内容。 其中 是流提取运算符。C 编译器会根据要输入值的数据类型选择合适的流提取运算符来提取值并把它存储在给定的变量中。所以使用C的输入输出你就不需要老考虑使用哪个占位符了这就方便了很多 我们再看输出 一个用的是printf一个用的是cout。printf函数也用到占位符cout用到流插入运算符。 C 编译器会根据要输出变量的数据类型选择合适的流插入运算符来显示值。流插入运算符 被重载来输出内置类型整型、浮点型、double 型、字符串和指针的数据项。endl表示换行符。 最后看看占位符 占位符是一种有特定作用的符号用于在格式化字符串中占住一个固定的位置之后填充。占位符也分为输入占位符和输出占位符。 输入占位符的一般格式为%[*][输入数据宽度][长度]类型, 其中有方括号[]的项为非必选项 输入占位符中[*]表示该输入项读入后不赋予相应的变量即跳过该输入值。 输出占位符的一般格式为%[标志][输出最小宽度][.精度][长度]类型, 其中有方括号[]的项为非必选项 输出占位符中[.精度]表示如果输出数字则表示小数的位数如果输出的是字符则表示输出字符的个数 下面举个小例子 2C的输入输出功能 C的输入输出功能是由输入输出流(iostream)库提供的。iostream是标准库的一部分。 输入输出流是一个类层次结构。标准输入standard input与预定义的iostream对象cin绑定在一起。标准输出standard output与预定义的iostream对象cout绑定在一起。标准错误standard error与预定义的iostream对象cerr绑定在一起。 输出操作符用来将一个值导向到标准输出cout或者标准错误cerr上。 双字符序列\n表示换行符newline。这是显式的进行换行还可以使用预定义的iostream操纵符endl。 操纵符endl是在iostream上执行的一个操作在输出流中插入一个换行符然后刷新输出缓冲区。 类似输入操作符用来从标准输入读入一个值 下面示例一个读取未知个数的输入值 3文件的输入输出 示例从origin.txt文件中读取数据写入到input.txt文件中 6、条件与分支 说明本部分不讲条件语句本身因为if语句本身是非常好理解的就是if条件成立就执行下面的代码块if条件不成立就跳过这些条件语句我在C语言系列有详细的讲解不明白的同学可以翻看那部分。这里我主要是深挖一下条件语句底层的实现逻辑 几个概念条件语句conditioan、if语句、分支语句branch 我们写if语句时是先对实际condition(条件语句)进行评估然后才是基于评估后的branch分支语句。 当我们开始一个应用程序时整个应用程序及其所有模块加载到内存中。所以这些所有的指令组成了我们的程序而且都被存储在内存中。当程序中有很多条件语句所产生的分支基本上就是告诉cpu跳到这部分执行再跳到那部分执行。这种在内存中跳来跳去的执行实际上其过程是非常复杂的。比如cpu得先检查条件然后跳到内存的不同地方然后从那里开始执行指令。这意味着if语句和分支通常有比较大的开销。如果你想让你的代码快最好少使用if语句。实际上很多优化的代码其实是特意避开分支的是特意避免使用if语句。 下面我们看看一个分支的运行过程 A是equality运算符, 能工作是因这个运算符在C标准库中被重载了。直白点说就是C标准库中有一个equality函数这个函数接受两个整数参数这个函数的功能是检查这个两个整数参数的内存(就是取这两个参数的四个字节的内存前面不是说过整数一般都是4个字节嘛)以确保它们是相等的(就是比较这个两个4个字节的每一位就是总共32位看看这32位是否每一位都是相等的只有32位全部相等才相等)如果相等返回true,不相等返回false。 同理你在C和C中看到的所有的这些操作符都一个道理都是在标准库中有确定的应用方式。 这里是先执行x5也就是先检验x是否等于5如果x等于5就返回true否则返回false 下面我们再通过反汇编视图(disassembly视图)看看编译器实际生成的if语句的汇编代码 这里汇编代码我可能讲不了就说几个点吧 cmpcomparasion jnejump not equal movmove jejump equal 条件跳跃 1我们前面说过bool类型占用的是一个字节(byte)但是一个字节里面有8位(bit)而bool只需要1位就可以表示了那编译器如何在一个byte中寻找那个bit的呢结论是只要这8位中有一位是1那就是true如果8位全部为0才是false。 2if汇编语句中第一行就是将变量ComparisonResult的值加载到寄存器eax。 第二行test是测试条件看eax寄存器是否是能通过条件就是是否是true就是是否有1。也就是对这两个寄存器进行逻辑与计算。 逻辑计算完毕后开始执行第三行jeje是条件跳跃如果test的结果是True就一行一行往后继续执行后面就是Log函数如果test的结果是false就是跳转到后面的地址执行。 3上面的反汇编视图是我们在调试(debug)模式下的汇编代码所以编译器实际上是一点都没有优化我们的代码所以我们可以回头看代码的运行机制。其实编译器在编译的时候是要进行优化的。 所谓优化实质上是对代码进行等价变换使得变换后的代码运行结果与变换前的代码运行结果相同而运行速度加快或占用存储空间减少或两者都有。 具体我们这里的if语句编译器其实在if语句前都已经知道if语句中的条件是否成立因为前面不是有int x 5嘛编译器都知道变量x的值是5所以x等不等于5编译器是知道的所以bool变量ComparisonResult是0还是1,编译器也是知道的。所以在实际的编译过程中编译器直接把if(false)下面的代码块直接就删除了。这点我们在讲编译预处理部分的时候也讲过。而不需要程序已经到执行阶段了再去比较x等不到5ComparisonResult是true还是false。 那预编译阶段编译器是如何做到比较的呢我们知道两个整数相等还是不相等就是所谓的常数折叠就是编译器其实在执行int x5时并不是给变量x分配一个首地址4个字节的长度而是把x 5保存到符号表里在用到x时会根据符号表把x替换成1。同理编译器再执行bool ComparisonResult x 5;时也不会给变量ComparisonResult分配一个自己去存储0或1,也是保存在符号表中。也所以预编译阶段编译器就知道x和5的比较结果了也就是ComparisonResult的值了。所以预编译阶段if语句中的不符合条件的分支代码块就已经被直接删掉了。if后面跟的分支语句都是满足if条件需要执行的语句这样就减少程序执行过程中的计算量了。 所以如果我们想调试自己的程序时你尽量关闭所有的优化最好就是处于debug模式下。 4if语句的写法 也所以我们上面例子中的if语句只要写if(ComparisonResult)即可其实是不用写if(ComparisonResulttrue)或if(ComparisonResult1)。而且即使如果你这样写了编译器也不会给你真正编译成让你再去调用标准库中equality函数再去对比一下ComparisonResult和1是否相等这个操作。 也所以上面的代码你还可以简写成下图1的形式 7、VS项目设置 在Visual Studio我们创建项目的步骤如下 但是Visual Studio的这种项目组织方式不是很合理。项目组织就是设置你的各种文件目录。一个清晰明了的目录可以使你的项目一目了然。我们通常的做法是创建一个名为Source或者src的文件夹这个文件夹包含我们所有的源代码、头文件等东西这样可以使我们的项目文件和可能使用到的任何其他资源能够被很好的分开在不同的文件夹中。下面我们更改这种组织方式 工必善必先利其器这里先介绍一下VS的设置以后我们还会讲到编译器设置、链接设置、release模式优化设置等。
http://www.hkea.cn/news/14291547/

相关文章:

  • 网站后台怎么做网站建设沈阳公司哪家好
  • 那些做兼职的小网站西安网站建设收费标准
  • 南京seo网站排名优化重庆营销网站建设公司
  • 小说网站风格临西网站建设公司
  • ios移动网站开发深圳设计品牌网站
  • 网站建设需要版块那个网站做3d
  • 汕头门户网站建设wordpress国内
  • 自己电脑做服务器搭网站什么软件可以免费发广告
  • 建站教学京东的网站建设历史
  • 苏州营销型网站制作服务外贸论坛
  • 旅游网站推荐排行榜wordpress图片剪切
  • 秦皇岛网站制作跨境电商网站怎么做
  • 环球资源网的网站特色推广策略是什么意思
  • 乡镇信息公开网站建设制度node.js 打开wordpress
  • 购物网站设计意义wordpress图片中文主题
  • 电脑网站和手机网站怎么做相同路径自己做网站卖二手车
  • 做外贸网站流程图软件技术有限公司
  • 广中路街道网站建设wordpress建设
  • 容桂网站设计制作网络推广营销服务
  • 浙江网站建设公司排名学室内设计去哪里学比较好
  • 营销网站建设都是专业技术人员吗国际物流公司
  • 北京有哪些网站建设商业网站 技术
  • 做警员编号网站微网站微名片
  • 余姚建设公司网站c 网站开发的优点
  • 网站建设维护文档界面网页设计培训
  • 网站幻灯片尺寸设置免费html模板素材网站
  • 微信怎么做链接网站井冈山保育院网站建设
  • 晋江网站开发求个网站没封的2021
  • 建设网站平台的建议建筑招聘
  • 网站速度优化方案网站和微信公众号建设方案