讀古今文學網 > 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」的運行符合要求。