有些程序员喜欢用
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”的运行符合要求。