操作符详解

2022-11-19 08:36:29 浏览数 (1)

操作符详解

分类:

算术操作符

移位操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

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

算术操作符

  • - * / %
代码语言:c 复制
#include<stdio.h>
int main()
{
    int a = 5 / 2;//取商
    int b = 5 % 2;//取余数
    printf("%d %d",a,b);
    return 0;
}//结果为2 1
  1. 除了 % 操作符只能作用于整数之外,其他的几个操作符可以作用于整除和浮点数
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数,执行的就是浮点数除法。

移位操作符

<< 左移操作符

>> 右移操作符

  • 右移操作符:

算术右移:右边丢弃,左边补符号位。一般的编译器都采用这种方式。 逻辑右移:右边丢弃,左边补零

代码语言:c 复制
//右移操作符
#include<stdio.h>
int main()
{
    int a = 16;
    //>> --右操作符
    //移动的是二进制位
    //而a定义为整型,有四个字节,把它变为二进制为10000
    //00000000000000000000000000010000
    int b = a >> 1;
    //而a>>1意为将a的二进制数向右移动
    //若是算术右移
    //00000000000000000000000000010000
    // 0000000000000000000000000001000"0"该零丢弃
    //"0"0000000000000000000000000001000 补符号位0是正数
    printf("%dn",b);//8
    return 0;
}
代码语言:c 复制
//对于负数
#include<stdio.h>
int main()
{
    int a = -1;
   //整数的二进制表示有:原码、反码、补码,上方正整数的二进制数原反补码都相同
    //存储到内存的是补码
    //100000000000000000000000000000001 -- 原码
    //111111111111111111111111111111110 -- 反码,符号位不变,其他的按原码位取反
    //111111111111111111111111111111111 -- 补码,反码加一
    int b = a>>2;
    //若是逻辑右移则
    // 11111111111111111111111111111111"1"丢弃
    //"0"11111111111111111111111111111111 左边补零变为正数
    printf("%d",b);// -1
    return 0;
}
  • 左移操作符:

左边丢弃,右边补0

代码语言:c 复制
#include<stdio.h>
int main()
{
    int a = 5;
    int b = a<<1;
    printf("%d",b);//10
    //a的补码为00000000000000000000000000000101
    //左移后为'0'0000000000000000000000000000101'0'
    //     该零丢弃                           右边补零
}

位操作符

  • 按位与&
代码语言:c 复制
#include<stdio.h>
int main()
{
    //& - 按2进制位与
    int a = 4;
    int b = 5;
    int c = a&b;
    printf("%d",&c);//4
    //00000000000000000000000000000100  --a--4
    //00000000000000000000000000000101  --b--5
    //00000000000000000000000000000100  --c = 4
    //按照对应的二进制位,两者都为1则该位取1否则取0
    return 0;
}
  • 按位或|
代码语言:c 复制
#include<stdio.h>
int main()
{
    // | - 按2进制位或
    int a = 4;
    int b = 5;
    int c = a|b;
    printf("%d",&c);//5
    //00000000000000000000000000000100  --a--4
    //00000000000000000000000000000101  --b--5
    //00000000000000000000000000000101  --c = 5
    //按照对应的二进制位,两者只要有一个为1则该位取1否则取0
    return 0;
    return 0;
}
  • 按位异或 ^
代码语言:c 复制
#include<stdio.h>
int main()
{
    // ^ - 按2进制位异或
    int a = 4;
    int b = 5;
    int c = a ^ b;
    printf("%d",&c);//1
    //00000000000000000000000000000100  --a--4
    //00000000000000000000000000000101  --b--5
    //00000000000000000000000000000001  --c = 1
    //按照对应的二进制位,相同为0,相异为1
    return 0;
    return 0;
}
代码语言:c 复制
//例,用按位异或的方法调换ab值
#include<stdio.h>
int main()
{
    int a = 4;
    int b = 5;
    printf("a=%d b=%d",a,b);
    a=a^b;
    b=a^b;
    a=a^b;
    printf("a=%d b=%d",a,b);
    return 0;
}
代码语言:c 复制
//求二进制位中1的个数(使用移位操作符)
#include<stdio.h>
int main()
{
    int num = -1;
    int i = 0;
    int count = 0;
    while(num)
    {
        for((num>>1)&1)==1)
            count  ;
    }
    printf("二进制1的个数为:%d",count);
    return 0;
}
代码语言:c 复制
//使用位操作符求求二进制位中1的个数
#include<stdio.h>
int main()
{
    int num = -1;
    int i = 0;
    int count = 0;
    while(num)
    {
     	count  ;
        num=num&(num-1);
    }
    printf("二进制1的个数为:%d",count);
    return 0;
}

赋值操作符

  • 复合赋值符

= , -= , *= , /= , %= , >>= , <<= , &= , |= , ^=

代码语言:c 复制
#include<stdio.h>
int main()
{
    int a = 0;// '=' 赋值符
    a  = 2;
  //等价于a=a 2,其他以此类推
    return 0;
}

单目操作符

! 逻辑反操作

- 负值

正值

& 取地址

sizeof 操作数的类型长度

~ 对一个数的二进制按位取反

-- 前置、后置 --

前置、后置

* 间接访问操作符(解引用操作符)

(类型) 强制类型转换

代码语言:c 复制
// !
#include<stdio.h>
int mian()
{
    int a=0;
    if(!a)//a为零,零为假,!a为真
        printf("peace");
    return 0;
}
代码语言:c 复制
//  &	*
#include<stdio.h>
int mian()
{
    int a=0;
    int*p=&a;//取地址操作符
    *p;//"*"解引用操作符,通过p存放的地址找到该地址位置,即a
    return 0;
}
代码语言:c 复制
// sizeof
#inlude<stdio.h>
int main()
{
    short b=0;
    int a = 10;
    char c = 'r';
    char*p = &c;
    int arr[10]={0};
    //sizeof 计算变量所占空间大小,单位是字节
    printf("%dn",sizeof(a));//4
    printf("%dn",sizeof(int));//4
    printf("%dn",sizeof(c));//1
    printf("%dn",sizeof(char));//1
    printf("%dn",sizeof(p));//8
    printf("%dn",sizeof(char*));//8
    printf("%dn",sizeof(arr));//40
    printf("%dn",sizeof(int [10]));//40
    printf("%dn",sizeof(b=a 5));//2 b为短整型
    printf("%dn",b);//0
    //sizeof()括号内部表达式不参与运算
    return 0;
}
代码语言:c 复制
//  ~
#include<stdio.h>
int main()
{
    int a=0;
    //~ 按二进制位取反
    //00000000000000000000000000000000 --a的补码
    //11111111111111111111111111111111 -- 补码
    //11111111111111111111111111111110 -- 反码
    //10000000000000000000000000000001 -- 原码
    printf("%d",~a);//-1
    return 0;
}
代码语言:c 复制
// example
#include<stdio.h>
int main()
{
    int a = 11;
    //00000000000000000000000000001'0'11让这一位为1
    a=a|(1<<2);
    //00000000000000000000000000001011 -- 11
    //00000000000000000000000000000100 -- (1<<2)
    //00000000000000000000000000001111 -- a|(1<<2)
    printf("%dn",a);//15
    //00000000000000000000000000001'1'11 这一位改为0
    a=a&~(1<<2);
    //11111111111111111111111111111011 -- ~(1<<2)
    //00000000000000000000000000001011 -- a&~(1<<2)
    printf("%d",a);//11
    return 0;
}
代码语言:c 复制
//    -- 前后置
#include<stdio.h>
int main()
{
    int a = 10;
    printf("%dn",  a);//前置  ,先 1,后使用,a为11
    printf("%dn",a  );//后置  ,先使用,后 1,a为11
    printf("%d",a);//12
    return 0;
}// --同理
代码语言:c 复制
// (类型)将数据强制转换
#include<stdio.h>
int main()
{
    double a = (int)3.14;
    printf("%f",a);
    return 0;// 3.000000
}

关系操作符

< <= > >= != ==

!= 用于测试不相等 == 用于测试相等

没什么好讲的比较简单

逻辑操作符

&& 逻辑与

|| 逻辑或

代码语言:c 复制
#include<stdio.h>
int main()
{
    int a = 3;
    int b = 5;
    int c = a&&b;
    printf("%d",c);//1
    return 0;
}
  • 注意点
代码语言:c 复制
//&&
#include<stdio.h>
int main()
{
    int i ,a = 0, b = 2, c = 3 , d = 4;
    i = a  &&  b&&d  ;
    printf("a=%dnb=%dnc=%dnd=%d",a,b,c,d);//1,2,3,4
    //因为a初始值为0,在上面逻辑与判断中a先使用进行逻辑与判断,初始为0,所以后面全部不执行,此时a再加1
    //所以在逻辑与判断中从,左往右判断,只有结果为真时才继续往后判断,否则后面全部不执行
    return 0;
}
代码语言:c 复制
//||
#include<stdio.h>
int main()
{
    int i ,a = 1, b = 2, c = 3 , d = 4;
    i = a  ||  b||d  ;
    printf("a=%dnb=%dnc=%dnd=%d",a,b,c,d);//2 2 3 4
    //同逻辑与类似,a初始值是1为真,所以后面的全部不执行
    //所以在逻辑或判断中从,左往右判断,只有结果为假时才继续往后判断,否则后面全部不执行
    return 0;
}

条件操作符

exp1 ? exp2 : exp3

表达式1为真则执行表达式2,不执行表达式3,若表达式1为假则相反

代码语言:c 复制
//例
#include<stdio.h>
int main()
{
    int i;
    for(i=0;i<2;i  )
    {
         i?printf("hahan"):printf("hehen");
    }
    return 0;
}
//hehe
//haha

逗号表达式

exp1 , exp2 , exp3 , expN ;

使用多个逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果

代码语言:c 复制
//例
#include<stdio.h>
int main()
{
    int a = 1;
    int b = 2;
    int c = (a>b,a=b 10,a,b=a 1);
    printf("%d",c);//13
    return 0;
}

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

下标引用 number

用于数组中,指代第x个元素

代码语言:c 复制
#include<stdio.h>
int main()
{
    int a[10]={0};
    a[4]=10;//其中[]这里面的4指a数组里面的第五个元素
    return 0;
}

函数调用()

代码语言:c 复制
#include<stdio.h>
int get_max(int x,int y)
{
    return x>y?x:y;
}
int main()
{
    int a = 5;
    int b = 10;
    int max = get_max(a,b);//此处括号即为函数调用操作符
    printf("%d",max);
    return 0;
}

结构体成员

"." 结构体

"->" 结构体指针

代码语言:c 复制
#include<stdio.h>
struct Man
{
    char name[20];
    int age;
    int weight;
};//对于struct Man 这是我们创建的一个类型,等价于int(整型)flooat(浮点型),而这个相当于一个人(Man)的类型
int main()
{
    struct Man M1={"LY",18,66};
    printf("%sn",M1.name);
    printf("%dn",M1.age);
    printf("%dn",M1.weight);
    //printf函数中的 “ . ”即为结构体成员
    //对于结构体指针如下
    struct Man* pM1 = &M1;
    printf("%sn",pM1->name);
    printf("%dn",pM1->age);
    printf("%dn",pM1->weight);
    //同理,该printf函数中“ -> ”即为结构体成员
    //两种结构体成员都是找到变量所对应的我们创建的(Man)类型中的内容
    return 0;
} -  

0 人点赞