上QQ阅读APP看书,第一时间看更新
3.3.4 比较错误
1.是否有不同数据类型的变量之间的比较运算,例如,将字符串与地址、日期或数字相比较?
2.是否有混合模式的比较运算,或不同长度的变量间的比较运算?如果有,应确保程序能正确理解转换规则。
3.比较运算符是否正确?程序员经常混淆“至多”、“至少”、“大于”、“不小于”、“小于”和“等于”等比较关系。
4.每个布尔表达式所叙述的内容是否都正确?在编写涉及“与”、“或”或“非”的表达式时,程序员经常犯错。
5.布尔运算符的操作数是否是布尔类型的?比较运算符和布尔运算符是否错误地混在了一起?这是一类经常会犯的错误,这里我们描述几个典型错误的例子:
·如果想判断i是否在2~10之间,表达式2<i<10是不正确的;相反,正确的应该是(2<i)&&(i<10)。
·如果想判断i是否大于x或y,表达式i>x||y也是不正确的,正确的应该是(i>x)||(i>y)。
·如果要比较三个数字是否相等,表达式if(a==b==c)的实际意思却大相径庭。
·如果需要验证数学关系x>y>z,正确的表达式应该是
6.在二进制的计算机上,是否有用二进制表示的小数或浮点数的比较运算?由于四舍五入,以及用二进制表示十进制数的近似度,这往往是错误的根源。7.对于那些包含一个以上布尔运算符的表达式,赋值顺序以及运算符的优先顺序是否正确?也就是说,如果碰到如同(if((a==2)&&(b==2)||(c==3))的表达式,程序能否正确理解是“与”运算在先还是“或”运算在先?
8.编译器计算布尔表达式的方式是否会对程序产生影响?例如,语句if((x==0&&(x/y)>z)对于有的编译器来说是可接受的,因为其认为一旦“与”运算符的一侧为FALSE时,另一侧就不用计算;但是对于其他编译器来说,却可能引起一个被0除的错误。