有些程序員喜歡用
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」的運行符合要求。