C语言运算符

前言 :

这篇笔记是大一下学期跟随老师学C语言时跟着老师写下的笔记

  • 由一个或多个操作数(变量,常量,字面值)以及运算符组成的符合C语言规则的式子叫做表达式
  • 表达式经过计算得到的结果称为表达式的值
  • C语言中数据可以分为左值和右值:
    • 左值:可以写的内存块(变量)
    • 右值:可以读取的内存块(变量,常量,字面值)
  • C语言中的运算符:
    • 算术运算符:+,-,*,/,%,++,–
    • 关系运算符:>,<,==,!=,>=,<=
    • 逻辑运算:&&,||(或),,!(非)
    • 赋值运算:
      • =(赋值)
      • +=,-=,*=,/=,%=(算术复合赋值运算符)
      • &=,|=,^=,>>=(位运算复合赋值运算符)
    • 位运算符:&,|,^,-,~,>>,<<
    • 条件运算符:?:
    • 逗号运算符:,
    • 指针运算符:&(取地址符),*(寻址符)
    • 求字节运算符:sizeof(获取字节数)
    • 特殊运算符:()(括号运算符),[](数组下标运算符),->(结构指针访问成员运算符)
  • 几个重要概念
    • 优先级:运算符执行的优先级,优先级高的先执行
    • 结合性:当优先级相同时,可以通过结合性确定表达式如何结合来确定执行的先后顺序
    • 类别:参与当前运算符运算的操作数个数,一元吗,二元,三元

一,算术运算符

1.1+,-,*,/,%
  • 都属于二元运算符

  • 运算规则:四则运算法则

  • 结果是一个值(右值,常量值)

  • 需要注意的地方:

    • 运算结果由参与运算的两个操作数类型决定
    • /除法运算符的右操作符不能为0
    • %运算符
      • 取余运算符的操作数必须为整型
      • 结果的符号由左操作数决定
      • C语言与Python对于负数取余结果是不一致的,原因是C语言与Python在处理整除运算时取值方向不一致,C语言向0取整,Python向负无穷取整
1.2 ++,–
  • ++称之为自增运算,–称之为自减运算
  • 拿++举例:
    • 前自增(前++):++操作数
      • 先在操作数自身基础上自加1,再取结果参与运算
    • 后自增(后++):操作数++
      • 先参与运算,再在结果上自加1

二,赋值运算符

2.1 简单赋值运算符
  • =(简单赋值运算符) 二元运算符
  • 优先级很低(仅高于逗号运算符)
  • 结合性从右到左
2.2 复合赋值运算符
  • op=(op表示算数运算符及位运算符) (+=,-=,%=…)

三,关系运算符

  • >,<,==,!=,>=,<=
  • 二元运算符
  • 结合性:从左到右
  • 优先级:>,<,>=,<=的优先级高于 ==,!=,关系运算符的优先级小于算数运算符
  • 关系运算符的结果为1或0(1代表true,0代表false)
  • 判断num变量的值是否在1~100之间;(1<=num&&num<=100)

四,逻辑运算符

  • &&(逻辑与,二元运算符),||(逻辑或二元运算符),!(逻辑非运算符)

  • 从结果上来说,C语言中真就是1,假就是0

#include <stdio.h>

int main(void) {
    int num;
    scanf("%d",&num);
    printf("%d\n",num>=1 && num<=99);
}
  • 从参与逻辑运算的操作数上来讲,C语言中非0代表真,0代表假

  • &&逻辑与

    • 真&&真->真
    • 真&&假->假
    • 假&&真->假
    • 假&&假->假
  • ||逻辑或

    • 真||真->真
    • 真||假->真
    • 假||真->真
    • 假||假->假
  • !逻辑非

    • !真->假
    • !假->真
  • 逻辑或的短路问题:当左操作数为真时,即可判断表达式结果,右操作数不执行

    #include <stdio.h>
    
    int main(void) {
    
        int a=1,b=1;
        printf("%d\n",++a||++b);
        printf("a=%d b=%d\n",a,b); //a=2 b=1
    
        return 0;
    }
    
  • 逻辑与的短路问题: 当做操作数为假时,即可判断表达式的结果为假,右操作数不执行

    #include <stdio.h>
    
    int main(void) {
    
        int a=-1,b=-1;
        printf("%d\n",++a&&++b);
        printf("a=%d b=%d\n",a,b); //a=0 b=-1
    
        return 0;
    }
    
五,条件运算符(三元运算符,三目运算符)
  • 操作数1?操作数2:操作数3

  • 表示含义:判断操作数1结果是否为真,如果操作数1结果为真,则整个条件表达式的结果为操作数2,否则整个条件表达式的结果为操作数3

  • 条件运算符是唯一一个三元运算符,所以有些地方也称之为三元运算符

    #include <stdio.h>
    
    int main(void) {
    
        int num;
        scanf("%d",&num);
        printf("%s\n",num%2==1? "奇数":"偶数");
        printf("%s\n",num%2? "奇数":"偶数");
    
        return 0;
    }
    
六,位运算符
  • &(位与),|(位或),~(位非),^(位异或),<<(位左移),>>(位右移)

  • 位运算就是直接操作二进制位

  • 运算符

    • &:两个操作数按位进行与运算(例如利用IP地址和子网掩码求网关)

      #include <stdio.h>
      
      int main(void) {
      
          short a = 18, b = 9;
          short c = a & b;
          // a  : 0000 0000 0001 0010
          // b  : 0000 0000 0000 1001
          // a&b: 0000 0000 0000 0000
          printf("%d\n",c); // c=0
      
          return 0;
      
      }
      
    • |:两个操作数按位进行或运算

    • ~:将操作数按位进行非运算

      #include <stdio.h>
      
      int main(void) {
      
          short a = 18; // 0000 0000 0001 0010
          short b = ~a; // 1111 1111 1110 1101
          printf("%d\n",b);
      
          return 0;
      
      }
      
    • ^:两个操作数按位进行异或运算

      • 异或规则:相同为0,不同为1

      • 0^0->0 1^1->0 0^1->1 1^0->1

        short a = 18;  // 0000 0000 0001 0010
        short b = 15;  // 0000 0000 0000 1111
        short c = a^b; // 0000 0000 0001 1101 (29)
        
      • 异或特性:一个数a位异或另外一个数b两次,结果还是这个数a本身

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值