尤其要注意正确选择“&&”和“||”运算符。
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,而且在它们左侧的操作数的值能够确定最终结果时,根本不会再对右侧的操作数求值。