王道C语言督学营—初级阶段

3.2-算术运算符与关系运算符

3.3-逻辑运算符与逻辑表达式

  • 运算符分类

1. 算术运算符
2. 关系运算符
3. 逻辑运算符
4.赋值运算符
5.求字节数运算符
6.强制类型转换运算符
  1. 算术运算符

    +;-;*;/;%;
    

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为真时,不会输出后面的

运算符优先级

alt

alt

说明: 同一优先级的运算符,运算次序由结合方向所决定.

简单记就是:! > 算术运算符>关系运算符>&&>||〉赋值运算符