逻辑运算符
if语句和while语句常用条件可表达式作为测试条件。有时,把多个表达式组合起来会很有用。
例如编写一个程序,计算输入的一行句子中出单双引号以外的字符数量。
/*chcount.c -- 使用逻辑运算符*/
#include <stdio.h>
#define PERIOD '.'
int main (void)
{
char ch;
int charcount = 0;
while((ch = getchar()) != PERIOD){
if(ch != '"' && ch != '\''){
charcount ++;
}
}
printf("There are %d not-quote characters.\n", charcount);
return 0;
}
I didn't read the "I'm a Programming Fool" best seller.
There are 50 not-quote characters.
程序首先读入一个字符,并检查它是否是一个句点,因为这里将句点做为一个句子的结束。if语句的测试条件是包含了&&(逻辑与运算符),意为:如果待测字符不是单引号且不是双引号,就将charcount加1 。
下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:
运算符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真。 |
书中指出,C语言使用标准美式键盘开发的语言,有些键盘中并没有这些符号,那么提供了其他途径来完成这些操作。
C给出了iso646.h头文件,如果程序中包含了该头文件,便可用and代替&&,or代替||,not代替!
优先级
关于优先级。!运算符的优先级很高,比乘法运算符高,与递增递减运算符平级,只比圆括号的优先级低。&&的优先级高于||,但两者的优先级都比关系运算符低,比赋值运算符高。因此表达式:a>b && b>c || b>d相当于((a>b) && (b>c) ||(b>d))。使用圆括号可以让程序更加清晰。
求值顺序
逻辑表达式的求值顺序是从左往右。一旦发现有使整个表达式为假的因素,立即停止求值。
有了逻辑表达式的加入,可以很容易的表达范围,但是要注意的是,数学上的范围写法是不能用的
if(90 <= range <= 100){
printf("Good show!\n");
}
上面这样的写法就是错误的,下面的才是正确写法
if(range >= 90 && range <= 100){
printf("Good show!\n");
}
---------------------------------------------分割线---------------------------------------------
条件运算符:?:
条件运算符需要三个运算对象,每个运算对象都是一个表达式,其通用形式如下:
experssion1 ? experssion2 : experssion3
如果experssion1为真,表达式的值为experssion2的值,否则表达式的值就是experssion3的值
C语言中,带着两个运算对象的成为二元运算符,带三个运算对象的就叫做三元运算符,而二元运算符有不少,三元运算符只有一个就是“?:”
下面的代码得到一个数的绝对值:x = ( y<0 ) ? -y : y
该表达式的意思是y 是否小于0,是则将-y赋值给x,不是则将y赋值给x。这条表达式同样可以用if else 表达式来描述:
if(y < 0){
x = -y;
} else{
x = y;
}
书上介绍了一个计算油漆桶数的程序,当然这个程序改一下还可用于其他地方
/*paint.c -- 使用条件运算符*/
/*
计算刷给定平方米的面积要多少油漆(以整罐计算)
*/
#include <stdio.h>
#define COVERAGE 350 //每桶油漆可以刷的面积
int main (void)
{
int sq_m;
int cans;
printf("输入要刷的面积:\n");
while(scanf("%d", &sq_m) == 1){
cans = sq_m / COVERAGE;
cans += ((sq_m % COVERAGE == 0)) ? 0 : 1;
printf("你需要%d %s of paint.\n", cans, cans == 1? "can" : "cans");
printf("输入还要刷的面积,或输入q退出程序:\n");
}
return 0;
}
随便输入两个数据:
输入要刷的面积:
250
你需要1 can of paint.
输入还要刷的面积,或输入q退出程序:
520
你需要2 cans of paint.
输入还要刷的面积,或输入q退出程序:
q