C语言学习分享/操作符

本文详细介绍了C语言中各种操作符的用法,包括算术操作符如除法和移位操作符的细节。通过实例展示了整数除法、浮点数除法、右移和左移操作,以及位操作符如按位与、按位或和按位异或。同时,还探讨了位移操作在负数上的表现,以及如何使用位操作交换变量的值。此外,还讲解了求整数二进制表示中1的个数的方法、sizeof操作符的陷阱和逻辑操作的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>

//算术操作符
// %两边必须为整数,返回的是取余之后的整数
//对于/,如果两个操作数都为整数,则执行整数除法,只要有浮点数就执行浮点数除法

//int main()
//{
//    float i,j,k;
//    i = 5.0 / 2;
//    j = 5 / 2.0;
//    k = 5.5 / 2.0;
//    printf("%f\n%f\n%lf\n",i,j,k);
//    return 0;
//}

//移位操作符
// 
//右移操作符:
//1.算数右移--=右边丢弃,左边补原符号位(根据正加0,负加1)
//2.逻辑右移--右边丢弃,左边补0
//左移操作符:左边丢弃,右边补0
//[1][][][][][][][][][]][][][][][][][][][]][][][][][][][][][][][]--首位为符号位    
//[0][][][][][][][][][]][][][][][][][][][]][][][][][][][][][][][]--(负数)
//100000000000000000000000000000001--为十进制 -1
//000000000000000000000000000000001--          1
// 
//原码->反码->补码--整数存储到内存的是补码
// **非负整数原反补码相同**
// 
// -1 - 10000000000000000000000000000001--原码
// 取反 11111111111111111111111111111110--反码
// 加1  11111111111111111111111111111111--补码
//补码右移,最前面加个1

//int main()
//{
//    int a = 19;      //--00000000000000000000000000001011
//    int b=a >> 1;    //右移操作符,移动的是二进制位
//    printf("%d\n",b); 
//    int c = -1; 
//    return 0;
//}


// & 按位与 --将数值转化为二进制后对齐,对齐的数都为1 取1,否则取0 得出结果
// | 按位或 --将数值转化为二进制后对齐,对齐的数有1个为1 取1,否则取0           
// ^ 按位异或--1对1得0 1对0得1 0对0得0

//不使用临时变量交换a b的值
//int main()
//{
//    int a=3;     //这种方法当超级大,接近最大值(2^32)时不适用
//    int b=4;
//    a = a + b;
//    b = a - b;
//    a = a - b;
//    printf("%d %d\n",a,b);
//    return 0;
//}
//int main()
//{   
//    int a = 3;    //执行效率低,可读性低
//    int b = 4; 
//    a = a ^ b;
//    b = a ^ b;
//    a = a ^ b;
//    printf("%d %d\n", a, b);
//    return 0;
//}

//求一个整数储存在内存中的二进制中的1的个数(补码)
//int main()
//{
//    int i ;
//    int count=0;
//    scanf("%d",&i);
//    int a;
//    for (a = 0; a < 32; a++)
//    {
//        if (((i >> a) & 1) == 1)   //该位&1后若等于1则该位必定为1
//        {                            
//            count++;
//        }
//    }
//    printf("%d\n", count);
//}

//sizeof的坑
//int main()
//{
//    int s = 0;
//    int b = 10;
//    short a=0;
//    printf("%d\n",sizeof(s = b + 5));
//    printf("%d\n", sizeof(a= b + 5)); //b是四字节,a是两字节,但此时b只是摆设,不改变a的值
//    printf("%d", s);
//}

//按位取反 ~
//int main()
//{
//    int a = 0;              //00000000000000000000000000000000  补码/原码/反码
//    a = ~a;         //按位取反11111111111111111111111111111111  补码
//    printf("%d",a);         //11111111111111111111111111111110  反码
//    return 0;               //10000000000000000000000000000001  原码
//}

//逻辑的坑
//int main()
//{
//    int a = 0, b = 2, c = 3, d = 4;
//    int i = a++ && ++b && c++;  //当执行到a++时a先使用此时&&前为假,于是&&后面全都不执行
//    printf("a=%d b=%d c=%d d=%d",a,b,c,d);
//    return 0;   //结果为1 2 3 4 --执行完a++
//}
//int main()
//{
//    int a = 1, b = 2, c = 3, d = 4;
//    int i = a++ && ++b && c++; 
//    printf("a=%d b=%d c=%d d=%d", a, b, c, d);
//    return 0;   //结果为2 3 4 4 --a,b c都加1
//}
//int main()
//{
//    int a = 1, b = 2, c = 3, d = 4;
//    int i = a++ || ++b ||c++;//当执行到a++时a先使用此时||前为真,于是直接得结果||后面全都不执行
//    printf("a=%d b=%d c=%d d=%d", a, b, c, d);
//    return 0;   //结果为2 2 3 4 --执行完a++
//}

//逗号表达式--从左倒油依次执行,结果取最后一个表达式的结果 
/*int main()
{
    int a = 1;
    int b = 2;
    int c = (a > b, a = a + b, a, b = a + 1);
    printf("%d\n", c);
    return 0;
}*/   //结果为4

//结构体--struct
//struct student     //使用struct student 这个类型创建了一个对象并初始化
//{
//    char name[20];
//    int age;
//    char ID[20];
//};               //注意 ;号
//int main()
//{
//    struct student a = { "张三",20,"1234567" };
//    printf("%s\n",a.name);
//    printf("%d\n", a.age);
//    printf("%s\n", a.ID);  // 结构体变量.成员名
//    struct student* p = &a;
//    printf("%s\n",(*p).name);  
//    printf("%s\n", p->name);
//    return 0;
//}

//整型提升--cpu一般以4字节进行算数操作运算,此时要将操作数提升为4字节类型
//int main()
//{
//    char a = 1;  //int类型的整数1--00000000000000000000000000000001
//                 //char只能定义8bit,截断,a--00000001
//    char b = 199;           //199--00000000000000000000000011000111
//                                   //截断,b--11000111
//    //a,b整型提升--按照变量的数据类型的符号位来提升
//    //a--00000000000000000000000000000001
//    //b--00000000000000000000000011000111  
//   //相加00000000000000000000000011001000 
//    char c = a + b;   //截断 c--11001000  -- 符号位为1整形提升高位补1
//                      //整型提升11111111111111111111111111001000--补码
//                              //11111111111111111111111111000111--反码
//    printf("%d",c);           //10000000000000000000000000111000--原码-> -56
//    return  0;
//}
//int main()
//{
//    char c = 3;
//    printf("%d\n",sizeof(c));   //c申请4个字节的空间
//    printf("%d\n", sizeof(+c)); //+c中的c参与算数运算,进行整形提升
//    printf("%d\n\n", sizeof(!c));//!a为0,1个字符占1字节空间
//    int a=0;     
//    printf("%d\n", sizeof(a));  
//    printf("%d\n", sizeof(+a));
//    printf("%d\n", sizeof(!a));
//    return 0;
//}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值