名著阅读 > 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,而且在它们左侧的操作数的值能够确定最终结果时,根本不会再对右侧的操作数求值。