有些程序员喜欢用
if (x )
语句,建议不要用这种简写的方式,应使用
if (x !=0 )
的方式。又如在下面语句
if (x=y ) func ( );
中,程序员的本意是检查x和y是否相等,还是赋值呢?某些编译器对形如这种的表达式会给出警告,要求编写者予以确认。这时可以采用显式地进行比较,例如改为
if ((x=y )!=0 ) func ( );
的结构,就会使得代码的意图一目了然。
【例16.3】有如下一个源程序。
#include <stdio.h> int main () { int a ,b ; printf (" 输入两个整数:" ); scanf ("%d%d" ,&a ,&b ); if (a&b ) printf (" 输入的两个数均不为0 。\n" ); else printf (" 输入两个数至少有一个为0 。\n" ); return 0 ; }
下面是运行实例。
输入两个整数: 3 5 输入的两个数均不为0 。 输入两个整数: 0 2 输入两个数至少有一个为0 。 输入两个整数: 5 0 输入两个数至少有一个为0 。 输入两个整数: 0 0 输入两个数至少有一个为0 。
根据运行示范,能判断程序是否正确吗?
【分析】运行示范确实符合要求,但这并不能说明程序没有错误。如果能找到一个输出错误的例子,就能否定这个程序。假如输入“12 3”,则有
输入两个整数:12 3 输入两个数至少有一个为0 。
由此可以证明程序运行不正确!这个程序使用“&”代替“&&”,对数据判断存在错误。&是位运算,而
12 & 3
中,12的代码是1100,3的代码是0011,其运算结果恰好为0,执行else语句则给出错误结果。应该使用
if ((a != 0 ) && (b != 0 ))
来代替它。改正的程序如下。
#include <stdio.h> int main ( ) { int a ,b ; printf (" 输入两个整数:" ); scanf ("%d%d" ,&a ,&b ); if ((a !=0 )&& (b !=0 )) printf (" 输入的两个数均不为0 。\n" ); else printf (" 输入两个数至少有一个为0 。\n" ); return 0 ; } 输入两个整数: 12 3 输入的两个数均不为0 。
修改后的程序对输入“12 3”的运行符合要求。