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