C Primer Plus学习_26 逻辑运算符and条件运算符

逻辑运算符

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值