3.2 关系操作符、条件操作符、逻辑操作符-C语言

1.关系操作符:

C语言用于比较的表达式,称为“关系表达式”,表达式中使用的运算符称为“关系运算符”。有以下6种。

  • >   大于运算符
  • <   小于运算符
  • >= 大于等于运算符
  • <= 小于等于运算符
  • == 相等运算符
  • !=  不相等运算符

关系表达式通常返回0或1,表示真假。

C语言中,0表示假,所有非零值表示真,比如:20>12返回1,12>20返回0。例如:

当一个变量和一个常量比较相等:建议将常量放在==的左边

关系表达式常用于if或while结构。

多个关系运算符不宜连用。

很显然a<b不小于c,但是仍打印nihao,错误。                                                      a<b<c:关系运算符是从左到右计算,所以先比较a<b,2<9成立,为1,1和c比较,1<8成立。所以打印nihao。=(a<b)<c

正确的表达式为:(a< b&& b<c)              &&:并且

打印结果为空,&&:并且,只有两边表达式都满足才打印。

exe1:输入年龄,若年龄在18岁-36岁之间,输出青年。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int age=0;
	printf("输入年龄:", age);
	scanf("%d", &age);
	if (18<=age<=36 )
		printf("青年\n");
	return 0;
}

运行结果:

2.条件操作符:

条件操作符也叫三目操作符,需要接受3个操作数,形式如下:

exp1?exp2 :exp3

表达式1                   操作符          表达式2                         操作符    表达式3

exp1(操作数1)        ?             exp2 (操作数2)              :       exp3(操作数3) 

条件操作符的计算逻辑:

若exp1为真,exp2计算,计算结果为整个表达式结果;

若exp1为假,exp3计算,计算结果为整个表达式结果。

exe2:使用条件表达式实现找两个数中较大的数。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	printf("输入两个值:", a, b);
	scanf("%d %d", &a, &b);
	int m =( a > b ? a : b);
	//如果a > b则 a大,否则b大
	printf("m=%d\n", m);
	return 0;
}

运行结果:

3.逻辑操作符:&&、||、!

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式。有以下3个运算符:

&&:逻辑运算符,表示并且(两侧表达式都为真,则为真,否则为假)。

||:逻辑运算符,表示或者(两侧至少有一个表达式为真,则为真,否则为假)。

!:逻辑取反运算符(改变单个表达式的真假)。

注意:C语言中,非0表示真,0表示假。

3.1 &&逻辑与运算符

a                    b                          a&&b

非0               非0                         1

非0                 0                           0

0                   非0                         0

0                     0                          0

&&:与运算符,表示并且,&&是一个双目操作符,使用方式:a&&b,&&两边的表达式都为真,则表达式为真,只要有一个为假,则整个表达式都为假。

exe3:若月份是3月-5月,则是春天。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int month = 0;
	printf("输入月份:", month);
	scanf("%d", &month);
	if (month >= 3 && month <= 5)
		printf("春天\n");
	return 0;
}

运行结果:

3.2 ||逻辑或运算符

||:或运算符,也是双目操作符,使用方式是a||b,||两边的表达式只要有一个是真,整个表达式为真,两边表达式都为假,才为假。

exe4:一年中12月或者1月或者2月是冬天。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int month = 0;
	printf("输入月份:", month);
	scanf("%d", &month);
	if (month == 12 || month == 1 || month == 2)
		printf("冬季\n");
	return 0;
}

运行结果:

3.3 !逻辑取反运算符

a                    !a

非0(真)      0

0                    1

逻辑取反运算符结果为假则为0,为真则用1表示。

exe5:!的用法。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int flag = 8;
	scanf("%d", &flag);
	if (!flag)
		printf("hehe\n");
	return 0;
}

运行结果:

3.4练习题

exe6:闰年的判断,输入一个年份,判断year是否是闰年。

判断闰年的规则:1.被4整除并且不能被100整除是闰年。2.能被400整除是闰年。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int year = 0;
	printf("输入年份:", year);
	scanf("%d", &year);
	if (((year % 4 == 0) || (year % 100 != 0))||(year % 400 == 0))

		printf("%d是闰年\n", year);
	return 0;

运行结果:

4.短路

C语言逻辑运算符的特点:总是先对左侧表达式求值,再对右侧表达式求值。若左侧表达式满足逻辑运算符的条件,就不再对右侧表达式求值,这种情况成为短路。

if(month >=  3 && month <= 5)

&&左操作数:month >=  3,右操作数:month <= 5。当左操作数month >=  3的结果为0,即使不判断month <= 5,整个表达式结果也是0。

所以,对于&&操作符来说,左边的操作数的结果是0时,右边操作数就不执行。

逻辑或运算符||

if(month ==  12 || month ==1 || month == 2)

若month==12,则不再判断month是否等于1或者2,则整个表达式结果也是1。

所以,对于||操作符来说,左边的操作数的结果不为0时,无需执行右边操作数。

这种仅仅根据左操作数的结果就知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。

练习题:

exe7:求下列代码的结果。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i =( a++ && ++b && d++);
	printf("i=%d\n a=%d\n b=%d\n  c=%d\n d=%d\n",i, a, b,c, d);
	return 0;
}

运行结果:

(a++ && ++b && d++)             a++:后置++,先使用后++,所以a++为0,对于&&操作符来说,左边的操作数的结果是0时,右边操作数就不执行。所以,i=0,a=1,b=2,c=3,d=4.

exe8:求下列代码的结果。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = 0, a = 1, b = 2, c = 3, d = 4;
	i = (a++ || ++b || d++);
	printf("i=%d\n a=%d\n b=%d\n c=%d\n d=%d\n", i, a, b,c, d);
	return 0;
}

运行结果:

(a++ || ++b || d++)             a++:后置++,先使用后++,所以a++为1,对于||操作符来说,左边的操作数的结果不为0时,无需执行右边操作数。所以,i=1,a=2,b=2,c=3,d=4.

根据以上内容求下列代码的结果,通过运行查看是否与所算结果一致。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = (a++ || ++b || d++);
	printf("i=%d\n a=%d\n b=%d\n c=%d\n d=%d\n", i, a, b,c, d);
	return 0;
}

  • 28
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值