C基础-操作符详解

操作符分类:

算数操作符:+ - * / %

cpp 复制代码
//算数操作符
// int main()
// {
//     //   /除法 1.整数除法(除号两端都是整数)  2浮点数除法,除号的两端只要有一个小数就执行小数除法
//     // 除法中,除数为0
//     int a = 7 / 2;
//     printf("%d\n",a); //3
//     double b = 7 / 2;
//     printf("%lf\n",b); //3.000000
//     double c = 7 / 2.0;
//     printf("%lf\n",c); //3.500000
//     int d = 0;
//     int e = 5 / d; //除数不可为0,编译器会报错

//     printf("%d\n",e);

//     return 0;
// }

int main()
{
    int a = 17 % 8; //% 得到数整数的余数
    //int b = 17.0 % 8.0; // %取模操作符的两个操作数必须都是整数才行
    printf("%d\n",a);

    return 0;
}

移位操作符:<< >>

cpp 复制代码
//移位操作符
//  <<左移操作符
//  >>右移操作符
//注意:以为操作符的操作数只能是整数  移动的是二进制
int main()
{
    //int a = 15;//00000000000000000000000000001111 -原码   //00000000000000000000000000001111 -反码 //00000000000000000000000000001111 -补码
    //int c = -15; //10000000000000000000000000001111 -原码 //11111111111111111111111111110000 -反码(原码的符号位不变,其他位按位取反) 11111111111111111111111111110001 -补码(反码+1就是补码)
    //int b = a >> 1;//移动的就是a中的二进制信息 //0000000000000000000000000000111 -  7
    //右移:算术右移(右边丢弃,左边直接补原来的符号位)  逻辑右移(右边丢弃,左边直接补0)
    // C语言没有明确规定是算术右移还是逻辑右移
    //int c = a << 1;//00000000000000000000000000011110
    //整数的二进制表示形式 : 原码 反码 补码 
    //正整数的原码、反码、补码是相同的
    //负的整数原码、反码、补码是要计算的
    //首先不管是正整数还是负整数都可以写出二进制原码  1.根据正负直接写出的二进制序列就是原码
    //1个整型是4个字节 = 32bit位
    //整数在内存中存储的是补码
    //计算的时候也是使用补码计算的
    // printf("%d\n",b); //7
    // printf("%d\n",c); //30

    // int d = -15; //10000000000000000000000000001111
    // int e = d >> 1;//11111111111111111111111111110001  ->  11111111111111111111111111111000 -> 11111111111111111111111111110111   ->00000000000000000000000000001000
    // printf("%d\n",e);

    //!移位操作符不要移负数哦
    int a = 6;// 110
    int b = a << 1;//1100
    printf("%d\n",b); //12

    return 0;
}

位操作符:& | ^

cpp 复制代码
//位操作符
//也是操作二进制位
// &
// int main()
// {
//     int a = 3; //00000000000000000000000000000011
//     int b = -5;//10000000000000000000000000000101  11111111111111111111111111111010 补码11111111111111111111111111111011
//     int c = a & b;
//     // & --  对应二进制位,有0则为0,两个同时为1才是1
//     //00000000000000000000000000000011
//     //11111111111111111111111111111011
//     //00000000000000000000000000000011  -补码

//     printf("%d\n",c); //3

//     return 0;
// }


//|
// int main()
// {
//     int a = 3; //00000000000000000000000000000011
//     int b = -5;//10000000000000000000000000000101  11111111111111111111111111111010 补码11111111111111111111111111111011
//     int c = a | b;
//     // | --  对应二进制位,有1则为1,两个同时为0才是0
//     //00000000000000000000000000000011
//     //11111111111111111111111111111011
//     //11111111111111111111111111111011  -补码
//     //11111111111111111111111111111010
//     //10000000000000000000000000000101 -5
//     printf("%d\n",c); //-5

//     return 0;
// }

//^
int main()
{
    int a = 3; //00000000000000000000000000000011
    int b = -5;//10000000000000000000000000000101  11111111111111111111111111111010 补码11111111111111111111111111111011
    int c = a ^ b;
    // ^ --  对应二进制位,相同为0,相异为1
    //00000000000000000000000000000011
    //11111111111111111111111111111011
    //11111111111111111111111111111000  -补码
    //11111111111111111111111111110111
    //10000000000000000000000000001000
    printf("%d\n",c); //-8

    return 0;
}

//不能创建临时变量,实现两个整数的交换
int main()
{
    int a = 3;
    int b = 5;
    printf("交换前: a=%d b=%d\n",a,b);
    // int tmp = a;
    // a = b;
    // b = tmp;

    // a = a + b;
    // b = a - b;
    // a = a - b;   超过整形最大存储则不行

    //a ^ a -> 0
    //a ^ 0 = a
    // 异或是支持交换律的
    //a ^ b ^ a = 5
    //a ^ a ^ b = 5
    a = a ^ b;
    b = a ^ b; // b = a ^ b ^ b = a
    a = a ^ b;// a = a ^ b ^ a = b
    printf("交换后: a=%d b=%d\n",a,b);


    return 0;
}

编写代码实现:求一个整数存储在内存中的二进制中1的个数

cpp 复制代码
//编写代码实现:求一个整数存储在内存中的二进制中1的个数
//方法1
// int main()
// {
//     //整数有32个bit位
//     //获得32个bit位的每一位,
//     //判断这一位是否为1
//     //是1就是记数器+1
//     int num = 10;
//     int count = 0;

//     while (num)
//     {
//         if (num%2 == 1)
//         {
//             count++;
//         }
//         num = num/2;
        
//     }
//     printf("二进制中1的个数 = %d\n",count);
    
//     return 0;
// }

//方法2
int main()
{
    int num = 10;
    int i = 0;
    int count = 0;
    for(i=0;i<32;i++)
    {
        if (num & (1 << i))
        {
            count++;
        }
    }
    printf("二进制中1的个数 = %d\n",count);
    return 0;
}

赋值操作符: = += -= *= /= ....

单目操作符: ! sizeof + - ~ & *

关系操作符: > < >= <= == !=

逻辑操作符:&& ||

条件操作符:? :

逗号表达式 : ,

下标引用,函数调用和结构成员: []. (). . ->

相关推荐
shinelord明7 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly2113 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu14 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202114 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
7yewh17 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
waicsdn_haha28 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
嵌入式科普29 分钟前
十三、从0开始卷出一个新项目之瑞萨RZN2L串口DMA接收不定长
c语言·stm32·瑞萨·e2studio·rzn2l
_WndProc30 分钟前
C++ 日志输出
开发语言·c++·算法
qq_4335545439 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
数据小爬虫@1 小时前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python