0
点赞
收藏
分享

微信扫一扫

操作数详解

  • 算数操作符
    +、-、*、/、%
    double a=5.0/2;(除数和被除数至少一个为小数,double类型保留小数点后6位)
    double a=5.0%2;(取模除数和被除数不能为小数)
  • 移位操作符
>>、<<
num<<;左移操作符
方法:左边丢弃,右边补0
num>>;右移操作符
方法:1算数右移:根据符号位来补,负数补1,正数补0(一般计算机使用)
      2逻辑右移:右边丢弃,左边补0 
//一般不能移动负数位,这是标准未定义的-num>>-1;error、
//三码之间的转换:原码 
               反码:原码符号位不变,其它位按位取反
              补码:反码符号位不变,最后一位+1(逢2进1)-计算机内存存储的  
  • 位操作符
    &、|、^
    &(按位与):011和101(一个0则为0,同为1才为1)结果是001
    应用:
    int a = 15;
    a = a&(~(1<<2));
    printf("%d\n",a);  //结果是11
    //00000000000000000000000000001111//把倒数第三位改为0
    //11111111111111111111111111111011//由下面的序列按位取反得到
    //00000000000000000000000000000100//由1<<2;可以得到
    //00000000000000000000000000001011
    |(按位或):011和101(一个1则为1,同为0才为0)结果是111
    应用:
    int a = 11;
    a = a|(1<<2);
    printf("%d\n",a);//结果是15
    //00000000000000000000000000001011//把倒数第三位改成1
    //00000000000000000000000000000100//1<<2;可以得到
    //00000000000000000000000000001111
    ^(按位异或):011和101(相同为0,相异为1)结果是110
    //位操作符只用于整型,不用于浮点型
  • 赋值操作符
    =(赋值) 、 ==(判断相不相等) 
  • 复合赋值符
    +=、-+、*=、/=、&=、>>=……等
  • 单目和双目操作符
    !a;-这里的!就是单目操作符,只有一个操作数(一般用于if语句中)
    a + b;-这里的+就是双目操作符,有两个操作数

    下面是单目操作符

  • 操作数的类型长度-sizeof()的用法
    //用来计算变量类型所占空间的大小,单位是字节
    int a = 0;
    char b = 'w';
    char*p = &a;
    int arr[10] = {0};//数组传参穿送的是第一个元素的地址,要使用指针接收
    printf("%d\n",sizeof(a));  //结果是4,求变量时可以把括号省略掉,类型不行
    printf("%d\n",sizeof(int)); //结果是4
    printf("%d\n",sizeof(b));  //结果是1
    printf("%d\n",sizeof(char));//结果是1
    printf("%d\n",sizeof(arr));  //结果是40
    printf("%d\n",sizeof(int [10])); //结果是40 
    printf("%d\n",sizeof(p));//结果是4或者8
    printf("%d\n",sizeof(char*));结果是4或者8,数组传参时,大小是指针类型大小
    short s = 0;
    int a = 10;
    printf("%d\n",sizeof(s = a + 5));  //结果是2-看short类型所占字节  
    printf("%d\n",s); //结果是0
  • 按位取反操作符
    ~(按二进制位取反)-一般和&|^、<<和>>搭配使用
    int a = 0;
    printf("%d\n",a);结果是0
    //00000000000000000000000000000000
    printf("%d\n",~a);结果是-1(别记混:打印的是该数字的原码)
    //11111111111111111111111111111111-按位取反之后的结果-补码
    //11111111111111111111111111111110-减去1-反码
    //10000000000000000000000000000001-原码
  • 前置和后置操作符
    ++、--
    前置++:先++后使用
    int a = 10;
    printf("%d\n",++a);//结果是11,先+1,再打印
    后置++:先使用后++
    int a = 10
    printf("%d\n",a++);//结果是10,然后再+1
    //--是一样的效果

    取地址和间接访问操作符

    &、*
    取出一个地址放在指针变量里面去//-char*pa = &a;

    强制类型转换

    int a = 3.14;(不能直接转换)
    int a = int (3.14);error
    int a = (int)3.14;//强制类型转换格式

    关系操作符

    >=、<=、>、<、!=、==
    注意:==和=书写时注意别写混淆

    逻辑操作符

    &&、||
    &&(逻辑与):1&2和1&&2--结果依次为:0和1
             001和010(左边只要有一个为假-0,右边就不算了)
    ||(逻辑或):1|2和1||2--结果依次为:3和1(左边只要为真-1,右边就不用算了)
    应用:
    int i = 0,a = 0,b = 2,c = 3,d = 4;
    i = a++ && ++b && d++;(a为0,&&后面所有的都是0,就不用算了)
    打印a,b,c,d:依次是1 2 3 4 
    int i = 0,a = 1,b = 2,c = 3,d = 4;(两个数都是非零,&&之后结果就为真是1)
    i = a++ && ++b && d++;
    打印a,b,c,d:依次是:2 3 3 5
    int i = 0,a = 1,b = 2,c = 3,d = 4;
    i = a++ || ++b || d++;(只要前面第一个为真,不管后面是真是假,后面的都不用算了)
    打印a,b,c,d:依次是:2 2 3 4

    条件操作符(三目操作符)

    exp1?exp2:exp3
    Max = (a>b ? a :b); //a如果大于b的话,Max = a;如果不大于,Max = b;

    逗号表达式

    exp1,exp2,exp3,……expN(从左向右一次执行,整个表达式的结果是最后一个表达式的结果)
    int a = 1;
    int b = 2;
    int c = (a>b,a=b+10,a,b=a+1); //打印出c的结果是13
    if(a=b+1,c=a/2,d>0) //表示的是如果d>0就为真,开始执行if语句了,前面的两个表达式也要参与计算
    //尽量少使用逗号表达式

    下标引用、函数调用和结构成员操作符

    下标引用操作符:[]-下标引用操作符,操作数是数组名+下标值-a[4]
    函数调用操作符:int max = get_max(a,b);-()就是函数调用操作符,操作数是get_max(函数名)+a+b
    访问一个结构的成员:.(左边是结构体变量,右边是成员名)、->(左边是一个结构体指针,右边是一个成员名)    
                   //描述一个学生-创建的一个结构体类型-struct stu{学生信息};
                   //使用结构体类型在主函数中创建了学生对象s1,并初始化
                   //struct stu s1 = {成员1,成员2,成员3}; ---s1是结构体变量
                   //打印一下:printf("%s\n",s1.成员1);---后面两个依次成员2,3
                   //struct stu *ps = &s1;
                   //printf("%s\n",(*ps).成员1);---后面两个依次成员2,3
                   //printf("%s\n",ps->成员1);---后面两个依次成员2,3

    隐式类型转换

    char a = 1,b = 2,c = 3;
    //由于a里面只能存储8个比特位,则会发生截断,取32个比特位最后面的8位
    整型提升:为了获得精度,表达式中的字符和短整型操作数在使用之前被转换为普通类型
    如何提升:按照变量的数据类型的符号位来提升的(是0就补0,是1就补1)
    a = b + c;   //加完过后还要放在char类型中,则会发生截断
    printf("%d\n",a); //还要进行整型提升,还要根据a补码来求原码
    char c = 1;
    printf("%u\n",sizeof(c));--结果是1
    printf("%u\n",sizeof(+c));--结果是4,因为发生了整型提升

    算数转换

    long double、double、float、unsigned long int、long int、unsigned int、int(所占空间由大-小)
    程序中上面任意两个变量进行运算,会现把小的类型转换为大的类型(比如:int和float,现将int类型转换为float类型)

    操作符的属性

    操作符的优先级(基本遵从数学算式里面的优先级)
    操作符的结合性(满足优先级,再从左往右结合)
    是否控制求值顺序(逻辑与&&、逻辑或||、条件操作符?:、逗号表达式也具有这个特点)
    例如:a*b + c*d + e*f---有问题的表达式
     c+ --c;--优先级高于+,但也存在问题,先算+(c = 1)结果是1,先算--(c = 1)结果是0
    //总结:一定要确定唯一的代码路径
举报

相关推荐

0 条评论