一、浮点数特性及比较方法

浮点数在多参数传参的时候默认是会进行精度转换,由float转换到double,浮点数是一个近视值,不能进行直接等于比较,一般可以用区间法比较但是会存在精度丢失的问题。

浮点数区间比较法:

​ 例:比较浮点数 f1f2 可以写成 abs(f1-f2) < 0.0001(其中精度由自己控制)

浮点相关算法设计的时候因为浮点数精度丢失的问题会存在当进行N次计算或比较后实际误差远远大于预计精度的问题。因此在设计算法的时候尽量要着重注意

常见解决办法有浮点精度补偿法(涉及专业数学问题),无限接近法。

无限接近法:经典应用,浮点数开平方根。

float f1 = 3.14f, up = f1, n = 0.0f, fcur = 0.0001f;
n = up / 2.0;
while(abs((n*n)-f1) > fcur)
{
if((n*n)-f1 > fcur)
{
up = n;
n = up / 2.0;
}
else
{
up = up - n;
n = up / 2.0;
}
}

二、IDE环境常用快捷键使用(VC++6.0)

快捷键 作用
F7 编译和链接
Ctrl+F7 只编译不链接
Alt+0 工作空间(窗口)
Alt+2 输出空间(窗口)
F10 单步步过,在没有编译的情况下会先执行编译,每次执行一行
F11 单步步入
F5 调试运行(遇断点停)
F9 设置/取消断点
Ctrl+F5 非调试运行(遇断点不停)
Shift+F11 回到上层调用处
Alt+F8 显示反汇编窗口,不同的编译器可能会出现相同的机器码解释成不同的汇编指令,但结果一致

F7实际作法就是将每个.cpp编译生成.obj,然后将多个.obj联合链接成一个.exe可执行文件

三、IDE环境常用区域分布

一般常用的窗口有:

内存窗口:查看进程内存,支持直接拖拽变量和地址直接定位

堆栈窗口:显示当前代码调用关联,用来查看代码关联性

寄存器窗口:显示上次计算残留值,用来观察指令对寄存器的影响

监视窗口:显示被监视变量或表达式的结果,该窗口会对表达式求值。如果是单步执行则每次单步都会求值一次,所以在监视窗口不能放影响左值的表达式

四、分支语句的区别和应用场景

在C语言中分支语句有:

if			//属于单分支语句	用于条件判断,例:if(a>b)
if else //属于双分支语句 用于条件选择判断,例:if(a>b){xx}else{oo}
if else if //属于多分支语句 用于分支选择判断,可预知输入集且指定分步规律(手动调整优先级,将输入集多的区间调整到最先判断)
switch case //属于多分支语句 用于分支选择判断
  • if else if能做区间比较,swithc case不能
  • switch case能得到编译器更好的优化,适用于数据分布均等,没有优先级的情况
  • 以上的判断语句中条件判断部分永远是判断表达式最后一个值,例:int i = 0 if(i=1) 返回真

五、Switch case 语句的内存分布情况和编译器优化原理

VC编译器中当switch casecase 数量大于3且各个case之间的差值不大于12(此值不固定,不同编译器可能不同)的时候编译器会启动优化,在内存中创建一个表用来顺序保存各case块的首地址,不存在该序号块的时候用default块地址填充,没有default的时候用swtich尾部地址填充。在访问的时候对case值做线性平衡(最小值不等于0的时候,正数减去最小值,负数加上最小值的正数),访问对应case的时候直接用查表的方式来取得case块的首地址跳过去

例:如果一个switchcase1,2,3,5,6,8时候,表从0下表开始:default,case1,case2,case3,default,case5,case6,default,case8

​ 访问时的伪代码:

mov eax,case值
sub eax,1
mov ebx,[eax * 4 + 表首地址]
jmp ebx

六、循环语句的种类和特点

循环语句有: while, do...while, for

特点:

  • while: 先判断后执行,可能循环体一次都不会执行。例:先给钱后吃饭
  • do...while: 先执行后判断,循环体至少执行一次。例:先吃饭后给钱
  • for: 是先初始化,再判断,再执行,执行完再处理

for 循环分:1初值部分,2终值部分,3循环体,4步长部分,5跳到第2步继续

七、goto模拟三种循环

do...while循环:

    int n = 1;
int nSum = 0; do
{
nSum = nSum + n;
n++;
}while(n <= 100); DO_BEGIN:
nSum = nSum + n;
n++;
if(n <= 100)
{
goto DO_BEGIN;
}

while循环:

    int n = 1;
int nSum = 0; while(n <= 100)
{
nSum = nSum + n;
n++;
} WHILE_BEGIN:
if(n > 100)
{
goto WHILE_END;
}
nSum = nSum + n;
n++;
goto WHILE_BEGIN;
WHILE_END:

for循环:

for循环三个部分都有的情况

    // for循环三个部分都有的情况
for(int n = 1, int nSum = 0; n <= 100; n++)
{
nSum = nSum + n;
} FOR_INIT:
int n = 1;
int nSum = 0;
goto FOR_CMP;
FOR_STEP:
n++;
FOR_CMP:
if(n > 100)
{
goto FOR_END;
}
nSum = nSum + n;
goto FOR_STEP;
FOR_END:

for循环没有初始化部分的情况

    //	for循环没有初始化部分的情况
int n = 1;
int nSum = 0;
for(; n <= 100; n++)
{
nSum = nSum + n;
} FOR_INIT:
goto FOR_CMP;
FOR_STEP:
n++;
FOR_CMP:
if(n > 100)
{
goto FOR_END;
}
nSum = nSum + n;
goto FOR_STEP;
FOR_END:

for循环没有初始化与步长部分的情况

    //	for循环没有初始化与步长部分的情况,下面这种情况就和while循环一样
int n = 1;
int nSum = 0;
for(; n <= 100;)
{
nSum = nSum + n;
n++;
} FOR_CMP:
if(n > 100)
{
goto FOR_END;
}
nSum = nSum + n;
n++;
goto FOR_CMP;
FOR_END:

for循环没有判断部分的情况

    //	for循环没有判断部分的情况
for(int n = 1, int nSum = 0;; n++)
{
if( n > 100)
{
break;
}
nSum = nSum + n;
} FOR_INIT:
int n = 1;
int nSum = 0;
goto FOR_STRIUCT;
FOR_STEP:
n++;
FOR_STRIUCT: //此处是循环体内的判断
if(n > 100)
{
goto FOR_END;
}
nSum = nSum + n;
goto FOR_STEP;
FOR_END:

总结

  • 由此可知do...while效率最高,正常情况下for循环效率最低。开优化后编译器会将for,while循环转换为do...while循环,提高效率。

  • 编译选项/ZI或/Zi与/O2不能同时有,两个是冲突选项(经过实验,手动编译同时有这两个编译选项,也能编译通过,但是还不知道采用的是那个编译选项)

  • 汇编语言是流水线模式,也就是循环体的内容是紧接着循环体上面的内容的,而汇编只有满足条件跳转的语义,所以while,for的判断条件与汇编层面是相反的。例:while(a>b){xx},则在汇编中判断就为if(a <= b) goto WHILE_END {xx}

八、附加知识

  • 三角形任意两边之和大于第三边
  • C语言符合ASNI标准,代码具有可移植性,非exe文件
  • 内存中包含了程序的数据部分代码部分(机器码相关数据)
  • 编写代码时最好把制表符(Tab键)的制表符号替换成空格(4个),这样方便跨环境看源码。如果直接使用Tab键,因为不同的编辑器对Tab键的解释是不一样的,从而导致从一个编辑器复制到另一个编辑器发生 布局混乱
  • if()后面只有一条语句也用括号括起来,防止语句使用宏,不利于调试
  • 一行只写一条语句,利于调试且好看

C-04\IDE基础知识和分支,循环语句的更多相关文章

  1. python-基础-基础知识-变量-选择-循环

    1 基础知识 1.1 注释的分类 1.2 变量以及类型 变量定义 num1 = 100 #num1就是一个变量,就好一个小菜篮子 num2 = 87 #num2也是一个变量 result = num1 ...

  2. awk基础03-分支和循环语句

        awk既然是一门解释型语言,则就可以支持如分支语句.循环语句等.今天就来学习一下在awk中的分支和循环语句.如果您有过任何一门编程语言的基础,则下面所讲内容也是很好理解的. 分支语句 if-e ...

  3. shell基础(八)-循环语句

    国庆过后:感觉有点慵懒些了:接着上篇:我们继续来学习循环语句. 一. for循环 与其他编程语言类似,Shell支持for循环. for循环一般格式为: for 变量 in 列表 do command ...

  4. c#基础;初步学习循环语句

    循环语句就是 在满足循环条件的情况下会有顺序的执行循环体 循环语句:for   :    while    :     foreach:三种. 循环语句 必须具备四要素:初始条件.循环条件.循环体.状 ...

  5. Python基础知识:while循环

    1.在循环中使用continue输出1-10之间的奇数 num=0 while num <10: num += 1 if num %2 == 0: #--%--运算符,相除返回余数 contin ...

  6. 04 javascirpt基础知识---听课笔记

    1.JavaScript概念 一门客户端脚本语言运行在客户端浏览器中的.每一个浏览器都有JavaScript的解析引擎脚本语言:不需要编译,直接就可以被浏览器解析执行了 * 功能:可以来增强用户和ht ...

  7. 实验3 分支&循环语句(1)

    part  1 1.在循环中使用控制语句continue和break,其功能区别是: continue:只控制本次循环的结束. break:终止并跳出循环,之后的循环也不再执行. 2.在两层嵌套循环中 ...

  8. PHP基础知识之————PDO预处理语句

    转载处:http://www.cnblogs.com/xiaohuochai/p/6133353.html 定义 在生成网页时,许多PHP脚本通常都会执行除参数之外,其他部分完全相同的查询语句,针对这 ...

  9. C#基础知识---迭代器与Foreach语句

    一.Foreach语句简介 在C# 1.0中我们经常使用foreach来遍历一个集合中的元素,然而如果一个集合要支持使用foreach语句来进行遍历,这个集合一般需要IEnumerable或IEnum ...

  10. MySQL数据库基础知识及优化

    MySQL数据库基础知识及优化必会的知识点,你掌握了多少? 推荐阅读: 这些必会的计算机网络知识点你都掌握了吗 关于数据库事务和锁的必会知识点,你掌握了多少? 关于数据库索引,必须掌握的知识点 目录 ...

随机推荐

  1. 万万没想到,除了香农计划,Python3.11竟还有这么多性能提升!

    众所周知,Python 3.11 版本带来了较大的性能提升,但是,它具体在哪些方面上得到了优化呢?除了著名的"香农计划"外,它还包含哪些与性能相关的优化呢?本文将带你一探究竟! 作 ...

  2. springboot集成支付宝的支付(easy版)

    SpringBoot对接支付宝 需要先注册账号 到支付宝开发者平台创建网页支付应用 启用公钥模式 需要使用到appId和下面的两个秘钥 写配置信息的代码 1.引入依赖 <dependency&g ...

  3. 领域驱动设计(DDD)在美团点评业务系统的实践

    前言 至少 30 年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,Eric Evans 将其定义为领域驱动设计(Domain-Driven Design,简称 DDD).在 ...

  4. Dubbo-Activate实现原理

    前言 在Dubbo中有Filter使用,对于Filter来说我们会遇到这样的问题,Filter自身有很多的实现,我们希望某种条件下使用A实现,另外情况下使用B实现,这个时候我们前面介绍@SPI和@Ad ...

  5. java集合类 collection接口,List集合

    java集合类:collection接口,List集合 在java.util包中提供了一些集合类,集合类又被称为容器,常用的有List集合,Set集合,Map集合.下面将介绍collection接口和 ...

  6. vivo浏览器的神奇操作

    关闭 root 权限也就罢了,你还搞这种操作 看到那个源文件了吗? 只有点击源文件下载的才是 官方提供的安装包, 而你首先看到的下载,点击后会下载vivo 应用商店的安装包. 那么这两种安装包有什么区 ...

  7. 记录一次从linux移动一个项目到windows遇到的问题

    前言 这几天在linux平台写了一个垃圾软件,浪费了我10多天的时间,感觉很垃圾,然后我想在windows平台打包这个软件,然后出现了一个项目中有相同文件名的问题,导致一些文件相互覆盖 问题描述 我把 ...

  8. 【Hadoop学习】中:HDFS、shell操作、客户端API操作、数据流、1NN、2NN原理、DataNode配置

    一.概述 1.背景.定义.使用场景(一次写入.不支持修改) 2.优(容错)缺点(延迟.不支持小文件.不支持修改) 3.组成架构 NameNode:Master,管理命名空间.配置策略 DataNode ...

  9. jjava基础语法

    java基础语法1 注释 注意: SDK要选择JDK1.8,且下面的语言要选择8,配置完这个环境后,JAVA才能正常运行. 单行注释 //+text 快捷键:ctrl+/ 多行注释  /*+text+ ...

  10. 铁威马NAS如何开启二次验证提高系统安全性

    想到登录TNAS时更安全?直接开启OTP二次验证,通过 TNAS mobile生成的一次性密码登录NAS存储,简单设置,提升TOS系统访问安全性给你TNAS双重保护. 1.首先,确认你的TOS系统在5 ...