讀古今文學網 > C語言解惑 > 16.4 正確選擇運算符 >

16.4 正確選擇運算符

尤其要注意正確選擇「&&」和「||」運算符。

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,而且在它們左側的操作數的值能夠確定最終結果時,根本不會再對右側的操作數求值。