需要给变量赋缺省值吗?
在很多不同级别、不同单位的编码标准中,都有关于变量定义时必须赋缺省值的规则。设置这条规则的理由很容易理解:避免出现使用没有赋过值的变量。当然,这个理由是有道理的,在不同的编译器中,对于没有赋值变量并没有统一的处理方式,有的赋0;有的赋类型边界值;有的赋随机值等等不一而同。在使用这样没有显式赋过值的变量时可能会导致意想不到的结果。如果在变量定义的时候赋予一个明确的值,就能够避免这种情况的发生。
遗憾的是,很多规则都存在两面性,这条规则也属于其中之一。变量的缺省值确保了变量至少有一个明确值,但是很明显,缺省值并不一定是在使用变量时所需要的值。如果在有缺省值的情况下,编程人员在使用变量前没有进行任何其它显式赋值,而缺省值又不是所预期的变量的值的话,很可能会导致不可预知的结果。
那问题来了,到底要不要设置这条规则呢?要得到这个问题的答案需要分析分析设置与不设置这条规则所造成的影响,在结合具体的应用场景综合加以评判。
要求变量必须赋予缺省值的好处即是避免出现使用没有赋过值的变量。下面主要分析一下其带来的问题。
问题1:增加了时间成本
如果缺省值是使用变量时所需要的值,相对于不赋缺省值且在使用前进行单独的赋值操作,二者的时间成本几乎没有差别。
如果缺省值不是使用变量时所需要的值,相对于不赋缺省值,显然增加了一个无用的赋值操作,很明显增加了时间成本。
由于该规则是统一要求,并不会区分不同的场景,当然也难以区分出是与不是使用变量时所需要的值的情况,但从经验来说,综合来看,缺省值是使用变量时所需要的值的情况肯定不比不是的情况多,所以可以得出该规则相对于不设置缺省值来说,增加了时间成本。
问题2:增加了出现不可预知结果的发生概率
假设代码编写完成后还要经过静态分析环节。如果应用了变量赋缺省值这条规则的话,一般情况下,静态分析工具很难找出缺省值不是要使用的值的问题,代码很可能在存在这个问题情况下审核通过甚至于使问题一直传递到应用阶段。相反,对于不设置缺省值的情况,静态分析工具能够很容易找出代码中存在“使用没有赋过值的变量”的问题,代码中的问题能够及时得到发现并解决。当然,有人会说即使是单独赋值也存在赋值错误的情况。但这种情况的发生主要由两个原因造成:设计错误以及人为失误。对于设计错误,同是否应用某条规则无关。而认为失误是小概率事件,在进行对比分析时,可以将其忽略。由此可知给变量赋缺省值会增加出现不可预知结果的发生概率。
如果代码编写完成后不经过静态分析环节直接编译、连接并应用,考虑到即使不显式赋缺省值,编译器也会进行隐式赋值;应用规则情况下下缺省值恰好是应用变量时所需值的概率;不赋缺省值在使用前忘记赋值的概率;可以得出结论:给变量赋缺省值并不能显著降低出现不可预知结果发生的概率。
由上分析可以得出结论:给变量赋缺省值会增加出现不可预知结果的发生概率。
问题3:增加修正成本
该问题同问题2相关。在均会出现由于使用时值不正确导致不可预知结果的情况下,给变量赋初值会导致问题会在更靠后的环节甚至是在故障发生后才能被发现。很明显,不给变量赋初值的情况下问题修正成本更低,尤其是在存在静态分析环节的情况下,这个问题通常在静态分析环节就被发现了。
综上所述,一般来说,比较给变量赋缺省值带来的好处以及问题,不给变量赋初值是更好的选择。但在特殊情况下,如变量是逻辑类型或枚举类型,缺省值恰好是变量应用时所需要的值的概率会大幅增加,并且应用对时间成本并不敏感时,可以考虑为变量赋予缺省值。
需要给变量赋缺省值吗?相关推荐
- 关于静态变量的缺省值
在调试Windows程序时,发现局部静态变量并没给初始值.通过调试并且查询资料,得知 1.除了静态变量外,所有局部变量没有缺省值: 2.静态 变量缺省值为0(无论是全局还是局部). 例如,如果stat ...
- vb 如何给静态变量赋初值
vb中不能在变量声明时赋默认值以外的初值,想要给静态变量赋初值,必须增加一个标志变量,如: Sub ss()Static i As Integer, f As BooleanIf Not f Then ...
- 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)...
1 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) 2 [功能]根据条件返回相应值 3 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或 ...
- vhdl变量赋初值_变量类型、构造器、封装以及 LeetCode 每日一题
1.成员变量和局部变量 1.1成员变量和局部变量定义 成员变量指的是类里面定义的变量(field),局部变量指的是在方法里定义的变量. 成员变量无须显示初始化,系统会自动在准备阶段或创建该类的实例时进 ...
- 移位 c语言一个变量存储两个值,【杭州C 培训】C语言中基础小问题总结
1.printf格式输出函数 如果格式控制说明项数多于输出表列个数,则会输出错误数据: 如果输出表列个数多于格式控制说明数,则多出数不被输出. %md,m指的是输出字段的宽度.如果输出字段位数小于m, ...
- 声明一个长方形类,属性有长和宽;操作有赋值、计算长方形的周长和面积、输出信息等,要求定义构造函数(缺省值为10)和析构函数。
题目描述:声明一个长方形类,属性有长和宽:操作有赋值.计算长方形的周长和面积.输出信息等,要求定义构造函数(缺省值为10)和析构函数. 析构函数的作用:对象消亡时,自动被调用,用来释放对象占用的空间. ...
- RHEL6基础之六RHEL6基本命令bash常用快捷键变量环境变量命令的返回值
命令帮助信息获取 sh 执行脚本 -x选项来查看这个脚本执行过程的 [root@localhost ~]# sh 1.sh [root@localhost ~]# sh -x 1.sh [root@l ...
- RESET - 把一个运行时参数值恢复为缺省值
SYNOPSIS RESET name RESET ALL DESCRIPTION 描述 RESET 将运行时参数恢复为缺省值. RESET 是下面语句的一个变种 SET parameter TO D ...
- jsp中把js变量赋给java变量,或者将java变量赋给js变量怎么做
在jsp中经常会遇到把js变量赋给java变量,或者将java变量赋给js变量的情况, 值得一提的是:两者确实有办法可以相互赋值,但有局限性:[原因如下] jsp脚本是服务器端脚本--页面一加载就会随 ...
最新文章
- c++多字节与宽字节字符串转换(windows平台)
- 0基础可以学Web前端吗?如何快速掌握前端开发技能?
- GB28181流媒体服务LiveGBS启动报错 HTTP Port[10000] In Use
- PowerShell 导出SharePoint管理中心解决方式
- 华三 h3c 交换机链路聚合
- javascript在IE和Firefox下的不同之处
- Unicode字符集和多字节字符集
- Java将Word/Excel转换成PDF—aspose工具
- ztree通过ajax获取json并勾选checkbook
- 计算机系统文件夹打不开,电脑系统的文件夹打不开可以试下这两个办法
- sgg-hbase-01
- 鸿蒙是什么动物,悟空是猴,八戒是猪,沙和尚是什么动物?乌巢禅师一句话说出答案...
- 程序与进程的区别和联系
- Apache Karaf 存在远程代码执行漏洞
- ITIL学习笔记——核心流程之:容量管理
- mysql 伪表查询语句_Oracle-05:伪表dual
- 《Python编程:从入门到实践》第13章:外星人来了
- BLE学习(1):蓝牙协议栈的介绍
- Navicat Linux无限试用
- 学习通第2章编程实践