C运算符

运算符

1.运算符介绍

  • 运算符是一种特殊的符号,用以表示数据的 运算、 赋值和 比较等
    • 算术运算符 (+, -, * , / , %)
    • 赋值运算符 (= += -= ..)
    • 关系运算符(比较运算符)(比如 > >= < <= == 等等)
    • 逻辑运算符 (&& 逻辑与 || 逻辑或 ! 逻辑非)
    • 位运算符 (& 按位与 | 按位或 ^ 按位异或 ~ 按位取反等等)
    • 三元运算符 ( 表达式 ? 表达1 : 表达2)

2.算数运算符

2.1 算术运算符

  • 算术运算符是对数值类型的变量进行运算的,在C程序中使用非常多

2.2 算术运算符一览

2.3 案例演示

  • 案例演示算数运算符的使用

    • +,-,*,/,%,++,--,重点说明/,%,++
  • 自增++

    • 作为独立的语句使用
    • 前++和后++都完全等价于 i=i+1
    • 作为表达式使用
      • 前++:先自增后赋值
      • 后++:先赋值后自增
  • --,+,-,*一样的道理

  • 代码演示

#include <stdio.h>

void main(){
    
    double d1 = 10 / 4;
    double d2 = 10.0 / 4;//如果希望保留小数,参与运算数必须有浮点数
    
    //取模公式
    //a%b=a - a/b*b
    
    int res1 = 10 % 3;
    int res2 = -10 % 3;
    int res3 = 10 % -3;
    int res4 = -10 % -3;
    
    //++的使用
    int i = 10;
    int j = i ++;//等价规则是:j = i;i=i+1;
    int k = ++i; //等价规则是:i=i+1;k=i;
    printf("i=%d j=%d",i,j);
    printf("i=%d k=%d",i,k);
    printf("d1=%f d2=%f res1=%d res2=%d res3=%d res4=%d",d1,d2,res1,res2,res3,res4);
    
    //++或者--还可以独立使用,就相当于自增自减
    //k++等价于k=k+1
    //++k等价于k=k+1
    //如果独立使用 ++k和k++完全等价
    k++;
    ++k;
    printf("k=%d",k);
    getchar();
}

2.4 细节说明

  • 对于除号/,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分
  • 当对一个数取模时,可以等价a%b=a-a/b*b ,可以看到取模的本质运算
  • 当自增作为一个独立的语句时,++i 和i++等价
  • 当自增作为一个表达式使用时j=++i等价i=i+1,j=i
  • 当自增作为一个表达式使用时j=i++等价j=i,i=i+1

2.5 练习

void main(){
    
    int i1 = 10,i2 = 20;
    int i = i1++;
    printf("i=%d ",i);
    printf("i1=%d",i1);
    i=++i1;
    printf("i=%d",i);
    printf("i1=%d",i1);
    i=i2--;
    printf("i=%d",i);
    printf("i2=%d",i2);
    i=--i2;
    printf("i=%d",i);
    printf("i2=%d",i2);
    getchar();
}
#include <stdio.h>

void main(){
    
    //假如还有97天放假,问:几个星期零几天
    //思路
    //1.定义一个days保存天数
    //2.定义week保存计算得到星期
    //3.定义leftDays保存剩余的天数
    //使用 % 和/
    int days = 97;
    int week = days / 7;
    int leftDays = days % 7;
    
    //定义一个变量保存华氏温度,华氏温度转换摄氏温度公式为:5/9(华氏温度-100,求华氏温度对应的摄氏温度)
    
    //用huashi表示华氏温度
    //用sheshi表示摄氏温度
    //使用公式来进行转换
    
    double huashi =146.3;
    double sheshi = 5.0/9(huashi-100);
    printf("华氏温度 %。2f对应的摄氏温度是%。2f",huashi,sheshi);
    printf("有%d个星期零%d天放假",week,leftDays);
    
    getchar();
    
}

3.关系运算符(比较运算符)

3.1介绍

  • 关系运算符的结果要么是真(非零表示),要么是假(零表示)
  • 关系表达式经常用在if结构的条件中或循环结构的条件中

3.2 关系运算符一览

== 等于

!= 不等于

< 小于

<= 小于等于

3.3 案例演示

#include <stdio.h>
void main(){
    int a = 8;
    int b = 7;
    printf("a>b=%d",a>b);
    printf("a>=b=%d",a>=b);
    printf("a<b=%d",a<b);
    printf("a<=b=%d",a<=b);
    printf("a==b=%d",a==b);
    printf("a!=b=%d",a!=b);
    
    getchar();
    
}

3.4 细节说明

  • 关系运算符的结果要么是真(非零表示,默认使用1),要么是假(0表示)
  • 关系运算符组成的表达式,我们称之为关系表达式
  • 比较运算符==不能误写成=赋值;

4.逻辑运算符

4.1 介绍

  • 假设变量A的值为1,变量B的值为0,则

&& 逻辑与运算符,如果两个操作数都非零,则条件为真,否则结果为零

|| 逻辑或运算符,如果两个操作数中有任意一个非零,则条件为真

! 逻辑非运算符,用来逆转操作数的逻辑状态,如果条件为真则逻辑非运算符将其为假

4.2 案例 演示

#include <stdio.h>

void main(){
    double score = 70;
    if(score >=60 && score <= 80){
        printf("ok1");
    }else{
        printf("ok2");
    }
    
    int a = 10,b = 99;
    //1.在进行逻辑与&&运算时,如果第一个条件为false,则后面的条件不在判断
    //2.该现象称为短路现象,所以逻辑与也称为短路逻辑与
    if(a<2&&++b>99){
        printf("ok100");
    }
    printf("b=%d",b);
    getchar();
}
#include <stdio.h>
void main(){
    int score = 100;
    int res = score >99;
    if(res){
        printf("hello,tom");
    }
    if(!res){
        printf("hello,jack");
    }
    getchar();
}
void main(){
    int x = 1;
    int y = 1;
    if(x++==2 && ++y==2){
        x=7;
    }
    printf("x=%d y=%d",x,y);
}

int x=1,y=1;
if(x++==1||++y==1){
    x=7;
}
printf("x=%d y=%d",x,y);
getchar();
void main(){
    int x = 1;
    int y = 0;
    short z = 42;
    if((z++ ==42)&&(y=1)){
        z++;
    }
    if((x=0)||(++z==45)){
        z++;
    }
    printf("z=%d",z);
    getchar();
}

5,赋值运算符

5.1 介绍

  • 赋值运算符就是将某个运算后的值,赋给指定的变量

5.2 赋值运算符一览表

  • 先将=,+=,-=,*=,/=,%= <<=,>>=,&=,^=,|=和位运算相关。

= 简单的赋值运算符,把右边操作数的值赋给左边操作数

+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋给左边操作数

-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋给左边操作数

*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数

/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数

%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数

<<= 左移且赋值运算符

右移且赋值运算符

&= 按位与且赋值运算符

^= 按位异或且赋值运算符

|= 按位或且赋值运算符

5.3 案例演示

  • 赋值基本案例[int num = 10+3]
  • 有两个变量a和b,要求将其值进行交换,最终打印结果
  • +=的使用案例
  • 代码演示
#include <stdio.h>
void main(){
    
    //+=的案例,其他的类似-=,*=,/=,%=
    int c = 12;
    int a2 = 10;
    
    int a = 10;
    int b = 20;
    //思路是通过一个临时变量来实现a,b值的交换
    int temp = a;
    a = b;
    b = temp;
    
    c += 3;
    c += b;
    a2 += 1.7
        
    printf("a=%d b=%d c=%d a2=%d",a,b,c,a2);
    getchar();
    
        
}

5.4 赋值运算符的特点

  • 运算顺序从右往左
  • 赋值运算符的左边只能是变量,右边可以是变量,表达式,常量值
  • 符合赋值运算符等价于下面的效果:a+=3等价于a=a+3;
  • 注意在运算时,可能截断小数点后面的部分
int a = 10;
a += 1.7;
a = 11;

6.位运算符

6.1 介绍

  • 位运算符作用于位,并逐位执行操作

6.2 位运算符一览表

& 按位与 ,按二进制位进行与运算

| 按位或运算符,按二进制进行或运算

^ 异或运算符,按二进制位进行异或
取反运算符,按二进制位进行取反运算

<< 二进制左移运算符,将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)

二进制右移运算符,将一个属=数的各二进制位全部右移若干位,整数左补零,负数左补1,右边丢弃

7.三元运算符

7.1 基本语法

条件表达式 ? 表达式1 : 表达式2;

  • 如果条件表达式为非0(真),运算后的结果是表达式1
  • 如果条件表达式为0(假),运算后的结果是表达式2

7.2 案例演示

#include <stdio.h>
void main(){
    int a = 10;
    int b = 99;
    int res = a > b?a++:b--;
    int n1 = a>b?1.1:1.2;
    
    printf("a=%d b=%d res=%d",a,b,res);
    getchar();
}

7.3 使用细节

  • 表达式一和表达式二要为可以赋给接收变量的类型(或可以自动转换),否则会精度损失
  • 三元运算符可以转成if---else语句
int a = 10;
int b = 100;
int c = 199;
int max = a > b ? a : b;
int max2 = max > c ? max :c;

8.运算符优先级

8.1 优先级小结

  • 结合的方向只有三个是从右向左,其余都是从左向右
  • 所有的双目运算符只有赋值运算符的结合方向是从右向左
  • 另外两个从右向左的运算符,一个是单目运算,一个是三目运算
  • 逗号的运算符优先级最低
  • 算数运算符>关系运算符>逻辑运算符(逻辑非!除外)>赋值运算符>逗号运算符

8.3 注意事项

  • .的优先级高于*
  • []高于*
  • 函数()高于*
  • ==和!=高于位操作
  • ==和!=高于赋值符
  • 算符运算符高于位移运算符
  • 逗号运算符在所有运算符中优先级最低
posted @ 2021-01-09 14:31  mx_info  阅读(192)  评论(0)    收藏  举报