王道C语言督学营—初级阶段
3.2-算术运算符与关系运算符
3.3-逻辑运算符与逻辑表达式
-
运算符分类
1. 算术运算符
2. 关系运算符
3. 逻辑运算符
4.赋值运算符
5.求字节数运算符
6.强制类型转换运算符
-
算术运算符
+;-;*;/;%;
2.关系运算符与关系表达式(优先级小于算术运算符)
> < >= <= == !=
依次为大于 小于 大于等于 小于等于 是否等于 不等于
当判断整型变量是否等于常量时,将常量写在前面,变量写在后面来防止少写一个等号而没有发现,这样如果少写一个等号会出现编译不通,从而快速发现错误
不写i == 3;写成 3 == i;
同时,在需要判断三个数是否相等时,不可以写为
if (5=5=5)
因为关系运算符本质是判断此条命令是真(1)还是假(0)
先判断了5=5是否为真,得到的结果是1,然后1=5得到的结果是0,判断出来三个数不相等,与实际并不符合
如下所示
#include <stdio.h>
int main(){
int a;
while (scanf("%d",&a))
{
if (3<a<10)
printf("a between 3 and 10\n");
else{
printf("a not between 3 and 10\n")
}
}
}
上述代码中,只要输入整数,结果一定是输出 a between 3 and 10
先输入a,有两种情况
1. 3<a 是真,得到了1,然后1<10也是真,得到了1,if成立,输出 a between 3 and 10
2. 3<a是假,得到了0,0<10是真,得到了1,if成立,输出 a between 3 and 10
所以只要是输入整数,结果都是一样的。
所以在编辑器中"printf("a not between 3 and 10\n")"这句是灰色,因为它不会被执行。
让循环结束的方法:
输入一个字母,scanf匹配不上会返回0,直接结束测试
想实现上述代码想要实现的功能,需要用到逻辑运算符
3<a && a<10
实现了a大于3,同时a小于10
3.逻辑运算符!、&&、||依次为逻辑非、逻辑与、逻辑或,逻辑非的优先级高于算术运算符,逻辑与和逻辑或的优先级低于关系运算符。逻辑表达式的值只有真和假,对应的值为1和0
//判断闰年
#include <stdio.h>
int main() {
int year;
while (scanf("%d", &year)) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
printf("%d is leap year\n", year);
} else {
printf("%d is not leap year\n", year);
}
}return 0;
}
逻辑非是单目运算符,自右向左运行
#include <stdio.h>
int main() {
int i=0,j=1;
i=!!j;
printf("i value=%d\n",i);
return 0;
}
i 的值一定为1,先进行!j得到的结果是0,再!0得到结果为1,此程序不论j的值是多少,输出的i一定为1。
4.短路运算
//逻辑与的短路运算
#include <stdio.h>
int main() {
int i = 0;
i&&printf("you can't see me\n");//当i为假时,不会执行逻辑与后的表达式,称为短路运算
return 0;
}
#include <stdio.h>
int main() {
int i = 0;
if(i){
printf("you can't see me\n");
}
return 0;
}
//逻辑或的短路运算
#include <stdio.h>
int main() {
int i = 1 ;
i||printf("you can't see me\n");
return 0;
}
//当i为真时,不会输出后面的
运算符优先级
说明: 同一优先级的运算符,运算次序由结合方向所决定.
简单记就是:! > 算术运算符>关系运算符>&&>||〉赋值运算符