选择合适的数据类型
数据类型的选择需要考虑两个条件:
(1)运行速度
优先考虑和CPU等宽的数据类型
比如32位下,操作int是最快的,一个寄存器刚好能处理一个int型数据
系统默认类型
比如浮点数默认的会用double,会比float更快
因为现在的浮点数处理器是64位的,(32位时默认的是float)
示例
如果要表示1,可以用:int类型、”1”、’1’、1.000。毫无疑问的,用字符串和字符是最慢的
(2)使用场景
无符号(unsigned)意味着里面都是正整数
比如我们定义一个学生个数的变量,int当然也可以做,但是如果我们用unsigned int会更好。一方面,学生的个数不可能是负数的;另一方面,又增大了可表示的数量
表现类型
活用typedef比如,翻页的时候,我们可以用int来表示页数,但是,用pageNum,会使我们要表达的意思更加的清楚,便于代码的阅读
接近原生的数据类型的操作速度会更快,根据使用场景来选择合适的数据类型
if和switch的使用场景
if
(1)语句过多的时候,会导致难以阅读;
(2)判断浮点数时要注意精度
switch
(1)分支(if)超过3个并且能够用switch的时候,尽量使用switch;
(2)case中的值只能是数值
如case strcmp(str1,str2)这样是不行的,如case 0可行。如果你使用的是0,1,2等等一些难以理解的数值(魔数),应该加注释。或者,可以使用前面说过的enum进行定义,代替这些魔数。(所以说enum常与switch搭配使用)
(3)必须有break,故意不写时要加注释
(4)default用于处理特殊情况,不要省略
区别
if可以替代switch,在if中可以嵌套,但是不建议在switch中进行嵌套,会导致难以阅读
if判断浮点数
(1)对于真假,除了0以外都是真(包括负数)
(2)判断一个浮点数时,不能用相等来判断,而应该是通过区间来判断因为浮点数在进行存储的时候,它是散失了一定精度的,而在进行”==”比较时,是拿着二进制来相对比,因为无法整除等各种各样的原因,可能导致每次所存储的值不相同,以0.0为例,应该以0~0.0000001区间来判断,至于再后面的位数,会被抛掉,至于是精确第几位,由我们自己定义
代码示例:
![]()
如果你进行了如下实验:
![]()
从下面监视可以发现,其实内存中存储的值和我们所定义的是有稍微偏差的。虽然在这个程序中运行是没问题的,但是因为浮点数的存储方式,指不定啥时候就不能完全相同了,那么if就进去了,到时候找bug就麻烦了。所以,在用if判断浮点数的时候,建议用区间。
循环语句
三种循环
for
先判断后循环,内含3个语句
示例:
for(int i=0;i<10;i++)
{
}while
先判断再执行示例
while(1)
{
}do…while
执行一次再判断
do
{
}while(1);注意:此种while后面有分号
联系
三者之间可以互相转换
区别
(1)for将循环变量的初始化在循环体内完成,会更简洁(2)不知循环次数的,循环条件在不停改变的,考虑用while
do while可以保证至少执行一次,do..while(false)用于统一出口的结构设计
break,continue,goto
作用
用于控制(破坏)循环流程
break
跳出当前语句块
continue
只能用于循环体内,用于跳出本次循环,跳转回循环头进行下一次循环
goto
不要用goto,会使得程序的流程变得难以捉摸