逻辑操作符:&& , || , !
- 逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。
- ! :逻辑取反运算符(改变单个表达式的真假)。
- && :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
- || :逻辑或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
- 注:C语⾔中,⾮0表⽰真,0表⽰假
1.1 逻辑取反运算符 !
⽐如,我们有⼀个变量叫 flag ,如果flag为假,要做⼀个什么事情,就可以这样写代码:
1 #include <stdio.h>
2 int main()
3 {
4 int flag = 0;
5 if(!flag)
6 {
7 printf("do something\n");
8 }
9 return 0;
10 }
如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真
所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。
1.2 逻辑与运算符
&& 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。
⽐如:如果我们说⽉份是3⽉到5⽉,是春天,那使⽤代码怎么体现呢?
1 int month = 0;
2 scanf("%d", &month);
3 if(month >= 3 && month <= 5)
4 {
5 printf("春季\n");
6 }
1.3 逻辑或运算符
|| 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b , ||
两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
⽐如:我们说⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天,那么我们怎么使⽤代码体现呢?
1 int month = 0;
2 scanf("%d", &month);
3 if(month == 12 || month==1 || month == 2)
4 {
5 printf("冬季\n");
6 }
1.4 练习:闰年的判断
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
1. 能被4整除并且不能被100整除是闰年
2. 能被400整除是闰年
1 #include <stdio.h>
2 //代码1
3 int main()
4 {
5 int year = 0;
6 scanf("%d", &year);
7 if(year%4==0 && year%100!=0)
8 printf("是闰年\n");
9 else if(year%400==0)
10 printf("是闰年\n");
12 11 return 0;
13 }
14 //代码2
15 int main()
16 {
17 int year = 0;
18 scanf("%d", &year);
19 if((year%4==0 && year%100!=0) || (year%400==0))
20 printf("是闰年\n");
21 return 0;
22 }
1.5 短路
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
如前⾯的代码:
1 if(month >= 3 && month <= 5)
表达式中&& 的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的
结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。
对于 || 操作符是怎么样呢?我们结合前⾯的代码:
1 if(month == 12 || month==1 || month == 2)
练习:阅读代码,计算代码输出的结果
1 #include <stdio.h>
2
3 int main()
4 {
5 int i = 0,a=0,b=2,c =3,d=4;
6 i = a++ && ++b && d++;
7 //i = a++||++b||d++;
8 printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
9 return 0;
10 }