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;
}