映月读书网 > C语言解惑 > 16.2 采用更明确的条件 >

16.2 采用更明确的条件

有些程序员喜欢用


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”的运行符合要求。