首页 » C语言解惑 » C语言解惑全文在线阅读

《C语言解惑》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; }  

运行示范如下:


输入一个数字:4y=34输入一个数字:5y=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;}  

运行示范如下:


输入一个数字:-5y=25输入一个数字:-4退出程序!输入一个数字:9y=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 4x=2y=18输入两个数字:3 2退出程序!输入两个数字:-2 -2x=-12y=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 4x=2y=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 0x=1y=13输入两个数字:0 1x=1y=13输入两个数字:-2 1x=-1y=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 3x=4y=34输入两个数字:1 -1x=0y=10输入两个数字:-2 1退出程序!输入两个数字:0 1x=1y=13输入两个数字:0 0退出程序!  

逻辑运算符“&&”、“||”和“!”,对操作数的处理方式都是将其视作非“真”即“假”。通常约定将0视作“假”,将非0视作“真”。当结果为“真”时,这些运算符都返回1,为“假”时则返回0。它们只可能返回1或0,而且在它们左侧的操作数的值能够确定最终结果时,根本不会再对右侧的操作数求值。