软件运行时展现出来的极严重的错误,在代码中,也许只是一个字符的错误!
就像是vector,一开始的咫尺,到最后就是天涯!
又像是蝴蝶挥动的翅膀,最终导致的飓风!
程序员的职业素质,就是有架构师的视野,自顶至下的计划,精密的逻辑,同时还要有抽丝拨茧的技术。
难缠的错误列表
1、溢出错误
在该实例中,移位操作针对int整数操作,导致数值溢出错误。
int b = 0;
int n = 0; ... n |= (b & 31) << k; vs
int b = 0; long n = 0; ... n |= (b & 31L) << k;
以上两段代码唯一的区别就是在31后面加了L表示长整型数。如果不用长整型数,在向左移位时就会导致移除错误。由于程序逻辑没有问题,只是执行结果是错的,调试起来极其麻烦。在程序设计中,使用移位操作时记得使用较大的类型避免溢出错误的发生。
2、?:运算符使用
在该实例里面,RealNumberValue记录了统计结果的值,结果使用三元运算符返回了错误的结果导致统计结果始终无法显示。
public double RealNumberValue { get { if (this.qrMeasures == null || this.qrMeasures.Count == 0) return double.NaN; return this.qrMeasures[this.measureIndex].Values != null ? double.NaN : (double) this.qrMeasures[this.measureIndex].Values[this.rowIndex]; } }
在使用?:三元运算符是,一定要避免将返回结果写反的情况,否则将导致返回结果不对的情况。如果不是特别熟练,请使用if..else取代?:的使用。
3、连续逻辑判断
在下面的例子中,有两个使用||链接起来的判断,错误发生在连接符上,起初使用的&&。
if (textureData == null || !texture.Update(textureData, true)) flag = false;
连续逻辑判断很容易混淆连接符后面的语句的执行条件,因此如果无法直观的确定后面逻辑的执行条件,请使用两个语句来表示连续逻辑判断,避免逻辑错误。