零基础C语言(三)

C语言运算符和表达式

运算符和表达式基本概念

  • 操作数 : 对于一个运算符需要几个数字才能使用 例如:加法的操作数是2,赋值的操作数也是2
  • 左值:运算符的左边 , 一般情况都是变量,不能是常量 error C2106: “=”: 左操作数必须为左值
  • 右值: 运算符右边的值,(常量,变量...)
  • 优先级:运算的先后顺序 a+b*(c+d);
  • 结合性:左结合 右结合

赋值运算符

  • =: 赋值运算符 int a=1; 赋值运算符返回的是值 int a=0,b=1; printf("%d",a=b) 返回1
  • int a=b=1; 这个写法是错误的 error C2065: “b”: 未声明的标识符,但是a,b都定义之后,联等是正确的。
  • 赋值运算符存在一个隐式转换,以左值的类型做转换
  • ++(a+b)错误 a+b运算后是值,不能作为左值
  • a=1返回值就是1

算术运算符

  • 加减法: + -

  • 乘法:* 必须写出来,不存在省略的写法,错误写法: a*b(c+d)

  • 除法: / 自动取整 ,也就是:4/5=0 ,如果想要小数除法结果,

    • 分子或者分母用一个浮点即可: 4.0/5,

    • 或者直接强转一下分子或者分母 (float)4/5前两个先结合

    • 分母不能为0

  • 取余: %

    • 只有整数才有,小数没有余数概念 ,错误写法3%3.0
    • 余数的符号问题,符号只和被取余数有关
  • 算术运算符中是 没有平方也就是幂运算 ,需要相关数学函数去描述

  • 复合赋值运算符

    • += -= /= *= ...

    • a+=1 a=a+1

    • a/=1 a=a/1

    • 复合赋值运算符和右边那个有没有括号是没有关系

      c *= a + b;   
      //错误解析c=c*a+b;
      //c=c*(a+b);
      

条件运算符

//大于号和小于号
a>b  b<a
//大于等于: >= 
//小于等于: <=
//不等于:!=   要注意的是:中间不能存在空格
//等于: ==   不要写成=
  • 条件表达式的值只有两种,成立(1)和不成立(0)

  • 计算机中的真和假: 非零值表示成立(真的),只有0 或者 NULL 或者\0 表示不成立(假的)

  • 不存在连续操作: 1<a <2 : 无论a的值是什么,1<a<2 都是成立的 1<a只会得到0/1,小于2永远成立

    1<a 只有两种(0,1) ,(0,1) 永远都是小于2 ,所以1<a<2永远都是成立,这个表达式的值为1

逻辑运算符

  • &&:逻辑与 理解为并且的意思 : 1<a&&a<2

  • 一个汉字占两个字节,用字符串表示数组长度至少为3

    a b a&&b
    真1 真1 真1
    真1 假0 假0
    假0 真1 假0
    假0 假0 假0
  • ||:逻辑或理解为或者的意思: a||b 只要一个条件满足,a||b等于1

  • !: 取反 真的变成假,假的变成真,成立变成不成立,不成立变成成立

  • &&与||都存在短路现象:短路现象就是计算机偷懒

    • a&&b : a不成立的时候 ,b不会去执行

    • a||b: a的值为1 ,b不会执行

      1、圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】;

      2、逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++】【 --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*】【&】、长度运算符【sizeof】;

      3、乘法运算符【*】、除法运算符【/】、取余运算符【%】;

      4、加法运算符【+】、减法运算符【-】;

      5、左移动运算符【<<】、右移动运算符【>>】;

      6、关系运算符【< 】【>】【<=】【 >= 】;

      7、等于运算符【==】、不等于运算符【!=】;

      8、按位与运算符【&】;

      9、按位异或运算符【^】;

      10、按位或运算符【|】;

      11、逻辑与运算符【&&】;

      12、逻辑或运算符【||】;

      13、条件运算符【?:】;

      14、赋值运算符【=】【/=】【*=】【%=】【+=】【-=】【<<=】【>>=】【&=】【^=】【|=】;

      15、逗号运算符【,】。

      取反加一 减一取反都可以

      括号很重要

位运算符

& | ~ ^按位操作 其中~注意存在补码转原码的过程

特殊运算符

  • ++ --(double类型也可以)

  • 内存共享 只看前置不看后置 所有的都一样

  • 最后的++的操作数不管前置后置都算

    • 前置:先自己改变,在去运算

    • 后置:先去运算,在改变自己

      int a = 1;
      //a++ 解析 a=a+1
      //a-- 解析 a=a-1
      int result = a++;			//后置 先做:result=a 再做a=a+1
      //result=1  a=2
      result = ++a;				//前置 先做a=a+1 再做result=a;
      //resuslt=3 a=3
      int b = 3;
      result = b--;
      //result=3   b=2
      result = --b;
      
  • sizeof(在编译期完成运算,其中进行的赋值运算均无效

    //sizeof:运算符
    result = sizeof(int); //4byte result=4
    result = sizeof(result); //result=4
    result=sizeof(char); //1
    result=sizeof(double); //8

  • ?:

    int a = 1;
    int b = 2;
    int max = (a > b ? a : b); //求最大值
    //(a > b ? a : b)
    //a>b 成立 (a > b ? a : b)等于a
    //a>b 不成立 (a > b ? a : b)等于b
    //因为1>2不成立 (a > b ? a : b)的值就是b

  • ,

    int a = 1;
    int b = 2;
    int max = (a > b ? a : b); //求最大值
    //(a > b ? a : b)
    //a>b 成立 (a > b ? a : b)等于a
    //a>b 不成立 (a > b ? a : b)等于b
    //因为1>2不成立 (a > b ? a : b)的值就是b
    //max=b; max=2
    //逗号表达式
    int d = 1;
    int c = 1;
    result = (c=a + b, d=b + c, c + d); //result=c+d
    //逗号表达式的有效值是最后边的表达式,但是其他表示也会执行

写代码时候,不知道优先级没关系,多用括号是没有错的。

a+b<3||b+c<4

(a+b<3)||(b+c<4);

  • 内存共享

    a=1

    a++ + a++ + a++ + a++

    只看前置不看后置,所有部分都是一样的值

    上式等价于a+a+a+a=4

    运行后a=5

    b=2

    b++ * ++b * b++ * ++b * b++

    b* b *b * b * b b等于4

​ 运行后b=7

posted @ 2022-06-28 11:39  (e^x)'  阅读(228)  评论(0)    收藏  举报