尤其要注意正確選擇「&&」和「||」運算符。
a&&b 若a、b都為真(即a、b值均為1),則a&&b為真,否則為假。它的邏輯關係計算公式為:0*0=0,0*1=0,1*0=0,1*1=1。
a||b如a、b都為假,則a||b為假,否則為真。它的邏輯關係計算公式為:0+0=0,0+1=1,1+0=1,1+1=1。
主要應熟練掌握1個變量和2個變量的情況。對1個變量來說,其實就是數軸上的取值範圍問題。假設變量為x,「&&」則涵蓋一段區域,例如區間(-5,5](-5<x<=5)表示為
(x > -5 ) && (x <= 5 )
【例16.16】演示1個變量使用「&&」的例子。
#include <stdio.h> int main ( ) { int x ,y ; printf (\" 輸入一個數字:\" ); scanf ( \"%d\" , &x ); while ( x>-5&&x<=5 ) { y=x*x+2*x+10 ; printf ( \"y=%dn\" , y ); printf (\" 輸入一個數字:\" ); scanf ( \"%d\" , &x ); } printf (\" 退出程序!n\" ); return 0 ; }
運行示範如下:
輸入一個數字: 4 y=34 輸入一個數字: 5 y=45 輸入一個數字: 6 退出程序! 輸入一個數字: -5 退出程序!
而「||」則是取兩個不同的區間,例如區間(∞,-5](x<=-5)和(5,∞)(x>5)。
【例16.17】演示1個變量使用「||」的例子。
#include <stdio.h> int main ( ) { int x ,y ; printf (\" 輸入一個數字:\" ); scanf ( \"%d\" , &x ); while ( x<=-5||x>5 ) // 任意一個為0 則退出 { y=x*x+2*x+10 ; printf ( \"y=%dn\" , y ); printf (\" 輸入一個數字:\" ); scanf ( \"%d\" , &x ); } printf (\" 退出程序!n\" ); return 0 ; }
運行示範如下:
輸入一個數字: -5 y=25 輸入一個數字: -4 退出程序! 輸入一個數字: 9 y=109 輸入一個數字: 5 退出程序!
對兩個變量的情況,例如變量x和y。最簡單的是取一個點的情況。例如x等於a或者x不等於a;y等於b或者y不等於b。也就是如下幾種情況:
x==a x !=a y==b y !=b
對於循環體而言,只能把這個點作為結束條件,所以使用「!=」號,即
(x != a ) && (y != b ) 和 (x != a ) || (y != b )
的情況。顯然,「&&」是先計算左邊的表達式,若x=a表達式為假,則整個表達式的值也為假,即滿足結束循環條件。
【例16.18】從鍵盤輸入整數a和b的值,則x和y分別由下式決定:
x=12/ (a+1 )+2/ (b-2 ); y=x*x+2*x+10 ;
編程循環計算x和y的值。
顯然a!=-1,b!=2。程序如下:
#include <stdio.h> int main ( ) { int a ,b ,x ,y ; printf (\" 輸入兩個數字:\" ); scanf ( \"%d %d\" , &a ,&b ); while ( a !=-1&&b !=2 ) { x=12/ (a+1 )+2/ (b-2 ); printf ( \"x=%dn\" , x ); y=x*x+2*x+10 ; printf ( \"y=%dn\" , y ); printf (\" 輸入兩個數字:\" ); scanf ( \"%d %d\" , &a ,&b ); } printf (\" 退出程序!n\" ); return 0 ; }
運行示範如下:
輸入兩個數字: 8 4 x=2 y=18 輸入兩個數字: 3 2 退出程序! 輸入兩個數字: -2 -2 x=-12 y=130 輸入兩個數字: -1 3 退出程序!
【例16.19】修改上面的程序,保證x的值大於等於0。
由x>=0可知,要保證6*b+a-11>=0。增加一個表達式即可,即改為
while ( a != -1 && b != 2 && ( 6*b + a – 11 ) >= 0 )
下面是運行示範:
輸入兩個數字: 8 4 x=2 y=18 輸入兩個數字: -2 -2 退出程序!
【例16.20】從鍵盤輸入整數a和b的值,則x和y分別由下式決定:
x=a+b ; y=x*x+2*x+10 ;
編程循環計算x和y的值。
顯然,a和b有一個為0,仍然有意義。只有a和b同時為0,才結束循環。所以本程序需要使用「||」運算符。
#include <stdio.h> int main ( ) { int a ,b ,x ,y ; printf (\" 輸入兩個數字:\" ); scanf ( \"%d %d\" , &a ,&b ); while ( a !=0||b !=0 ) // 兩個均為0 則退出 { x=a+b ; printf ( \"x=%dn\" , x ); y=x*x+2*x+10 ; printf ( \"y=%dn\" , y ); printf (\" 輸入兩個數字:\" ); scanf ( \"%d %d\" , &a ,&b ); } printf (\" 退出程序!n\" ); return 0 ; }
運行示範如下:
輸入兩個數字: 1 0 x=1 y=13 輸入兩個數字: 0 1 x=1 y=13 輸入兩個數字: -2 1 x=-1 y=9 輸入兩個數字: 0 0 退出程序!
【例16.21】下面是修改上面的程序,保證x的值大於等於0。試判斷下面的修改是否正確。修改的依據是x=a+b,所以推知條件為a+b>=0。為此就把while語句改為
while (a != 0 || b != 0 || (a+b >= 0 ))
試問這種修改對嗎?
不對,因為不能再用或(||)的關係。如果用或的關係,則要求三個條件都要同時滿足,顯然是不對的。應該將原來的條件與現在新增的條件相與(&&),即修改為:
while (( a != 0 || b != 0 ) && ((a+b ) >= 0 ))
運行示範如下:
輸入兩個數字: 1 3 x=4 y=34 輸入兩個數字: 1 -1 x=0 y=10 輸入兩個數字: -2 1 退出程序! 輸入兩個數字: 0 1 x=1 y=13 輸入兩個數字: 0 0 退出程序!
邏輯運算符「&&」、「||」和「!」,對操作數的處理方式都是將其視作非「真」即「假」。通常約定將0視作「假」,將非0視作「真」。當結果為「真」時,這些運算符都返回1,為「假」時則返回0。它們只可能返回1或0,而且在它們左側的操作數的值能夠確定最終結果時,根本不會再對右側的操作數求值。