在很多不同级别、不同单位的编码标准中,都有关于变量定义时必须赋缺省值的规则。设置这条规则的理由很容易理解:避免出现使用没有赋过值的变量。当然,这个理由是有道理的,在不同的编译器中,对于没有赋值变量并没有统一的处理方式,有的赋0;有的赋类型边界值;有的赋随机值等等不一而同。在使用这样没有显式赋过值的变量时可能会导致意想不到的结果。如果在变量定义的时候赋予一个明确的值,就能够避免这种情况的发生。
遗憾的是,很多规则都存在两面性,这条规则也属于其中之一。变量的缺省值确保了变量至少有一个明确值,但是很明显,缺省值并不一定是在使用变量时所需要的值。如果在有缺省值的情况下,编程人员在使用变量前没有进行任何其它显式赋值,而缺省值又不是所预期的变量的值的话,很可能会导致不可预知的结果。
那问题来了,到底要不要设置这条规则呢?要得到这个问题的答案需要分析分析设置与不设置这条规则所造成的影响,在结合具体的应用场景综合加以评判。
要求变量必须赋予缺省值的好处即是避免出现使用没有赋过值的变量。下面主要分析一下其带来的问题。
问题1:增加了时间成本
如果缺省值是使用变量时所需要的值,相对于不赋缺省值且在使用前进行单独的赋值操作,二者的时间成本几乎没有差别。
如果缺省值不是使用变量时所需要的值,相对于不赋缺省值,显然增加了一个无用的赋值操作,很明显增加了时间成本。
由于该规则是统一要求,并不会区分不同的场景,当然也难以区分出是与不是使用变量时所需要的值的情况,但从经验来说,综合来看,缺省值是使用变量时所需要的值的情况肯定不比不是的情况多,所以可以得出该规则相对于不设置缺省值来说,增加了时间成本。
问题2:增加了出现不可预知结果的发生概率
假设代码编写完成后还要经过静态分析环节。如果应用了变量赋缺省值这条规则的话,一般情况下,静态分析工具很难找出缺省值不是要使用的值的问题,代码很可能在存在这个问题情况下审核通过甚至于使问题一直传递到应用阶段。相反,对于不设置缺省值的情况,静态分析工具能够很容易找出代码中存在“使用没有赋过值的变量”的问题,代码中的问题能够及时得到发现并解决。当然,有人会说即使是单独赋值也存在赋值错误的情况。但这种情况的发生主要由两个原因造成:设计错误以及人为失误。对于设计错误,同是否应用某条规则无关。而认为失误是小概率事件,在进行对比分析时,可以将其忽略。由此可知给变量赋缺省值会增加出现不可预知结果的发生概率。
如果代码编写完成后不经过静态分析环节直接编译、连接并应用,考虑到即使不显式赋缺省值,编译器也会进行隐式赋值;应用规则情况下下缺省值恰好是应用变量时所需值的概率;不赋缺省值在使用前忘记赋值的概率;可以得出结论:给变量赋缺省值并不能显著降低出现不可预知结果发生的概率。
由上分析可以得出结论:给变量赋缺省值会增加出现不可预知结果的发生概率。
问题3:增加修正成本
该问题同问题2相关。在均会出现由于使用时值不正确导致不可预知结果的情况下,给变量赋初值会导致问题会在更靠后的环节甚至是在故障发生后才能被发现。很明显,不给变量赋初值的情况下问题修正成本更低,尤其是在存在静态分析环节的情况下,这个问题通常在静态分析环节就被发现了。
综上所述,一般来说,比较给变量赋缺省值带来的好处以及问题,不给变量赋初值是更好的选择。但在特殊情况下,如变量是逻辑类型或枚举类型,缺省值恰好是变量应用时所需要的值的概率会大幅增加,并且应用对时间成本并不敏感时,可以考虑为变量赋予缺省值。