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

浮点数在多参数传参的时候默认是会进行精度转换,由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. springboot使用jira-rest-java-client-api集成jira,自定义对查询board和sprint的支持

    公司内部使用jira作项目管理,我接到新的需求,要在测试报告上获取jira的所有项目,再根据项目获取board看板,再根据看板获取Sprint,最后获取未完成的bug信息.效果如下: 第一次接入jir ...

  2. 嵌入式-Linux基础操作

    Crtl+Alt+T:调出命令窗口 xrandr:列出分辨率列表 设置窗口的分辨率大小为1280x960:xrandr -s 1280x960 通过命令窗口来执行一段C语言程序: VI工具的使用: ( ...

  3. 基于python的数学建模---最小二乘拟合

    import numpy as np import matplotlib.pyplot as plt from scipy.optimize import leastsq from matplotli ...

  4. 常用内置模块os sys json

    今日内容回顾 目录 今日内容回顾 os模块 sys模块 json模块 json模块实战 os模块 sys模块 json模块 os模块 os模块主要与代码运行的操作系统打交道 1.创建目录(文件夹) i ...

  5. [0x12] 135.最大子序和【单调队列】

    我在知乎上看到一句话,如一道晴天霹雳: "如果一个选手比你小还比你强,你就可以退役了."--单调队列的原理 题意 link(more:P1714) 给定一个长度为 \(n\) 的整 ...

  6. [OpenCV实战]3 透明斗篷

    目录 1寻找和存储背景帧 2红色区域检测 3提取红色区域 4背景帧红布区域替换当前帧红布区域. 5工程代码 参考 弄出哈利波特电影里一样效果的透明斗篷.也就是一个视频里,将红布弄成透明.类似下面的效果 ...

  7. Spring项目中用了这种解耦模式,经理对我刮目相看

    前言 不知道大家在项目中有没有遇到过这样的场景,根据传入的类型,调用接口不同的实现类或者说服务,比如根据文件的类型使用 CSV解析器或者JSON解析器,在调用的客户端一般都是用if else去做判断, ...

  8. python进阶之路20 正则表达式 re模块

    正则表达式前情 案例:京东注册手机号校验 基本需求:手机号必须是11位.手机号必须以13.15.17.18.19开头.必须是纯数字 '''纯python代码实现''' # while True: # ...

  9. 《Effective C++》设计与声明章节

    Item18:让接口容易被正确使用,不易被误用 总结: 1.好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达到这些性质. 2."促进正确使用"的办法包括接口的一 ...

  10. [LeetCode]819. 最常见的单词

    题目 给定一个段落 (paragraph) 和一个禁用单词列表 (banned).返回出现次数最多,同时不在禁用列表中的单词.题目保证至少有一个词不在禁用列表中,而且答案唯一. 禁用列表中的单词用小写 ...